2011-01-20 10 views
15

に順序が重要でないようにする方法を私は時にxmlファイルの構造を確認するためにDTDを使用したい私のデータを格納するのに便利な方法として、XMLファイルおよびパーサを使用してXML、DTD:

スタートを切りました彼らが到着します。こうしたすべてが正常に動作としてここ

は私のDTDファイル

< ?xml version="1.0" encoding="UTF-8"?> 
< !ELEMENT document (level*)> 
< !ELEMENT level (file,filelName?,fileNumber?)> 
< !ELEMENT file (#PCDATA)> 
< !ELEMENT filelName (#PCDATA)> 
< !ELEMENT fileNumber (#PCDATA)> 

(fileNameにとファイル番号が実際に純粋にオプションであることに注意してください)

<document> 
<level> 
    <file>group1file01</file> 
</level> 
<level> 
    <file>group1file02</file> 
    <fileName>file 2</fileName> 
    <fileNumber>0</fileNumber> 
</level> 
... 

です。私は、行の順序を変更する

<level> 
    <levelName>Level 2</levelName> 
    <levelNumber>0</levelNumber> 
     <file>group1level02</file> 
</level> 

をすれば、私は私が考えるものだ試験する奇妙なエラー

ありながら、しかし

(私は今のためにそれをテストするための日食「検証」オプションを使用します) Eclipseはそれを検証することを拒否します...

これはEclipseに問題があるのか​​、またはその注文が実際に重要かどうか疑問でした。

要素の順序に関係なく、DTDをどのように変更することができますか?

すべてのXMLファイルとパーサーが書かれているので、XMLを実際に変更することはできません(私はそれを間違った方法で行っていました)。

答えて

8

は、唯一のリストが並べられていますが、すべて受け入れ組み合わせ

<!ELEMENT level ((file,filelName?,fileNumber?)|(filelName?,fileNumber?,file))> 

ルックhereを定義する演算子OR |を使用することができ、セクションの例であり選択肢

+0

ハム...私はそれがより柔軟になると思っていただろう...私は一緒に行かなければならないだろうなぜなら、xmlが読み込まれる順番でこのように仮定しなければならなかったからです。 –

+4

これは確定的ではないため、有効なDTDではありません。たとえそれが有効であったとしても、可能な順序で子要素を許可しません。 – jasso

4

DTDの場合、子ノードは要素定義にリストされた順序で表示する必要があります。 XSDスキーマにアップグレードする場合を除き、代替注文を許可する方法はありません。

補足:(@、b、c ...)|(b、a、c ...)の構文を使用して代替注文を提供していますが、これは本当に実用的ではありません3つの要素の場合は6、4つの要素の場合は24、5つの要素の要素の場合は120など、任意の順序で階乗の階乗数が許されるため、3つのネストされた要素よりも優れています。オペレータは間違ったケースに対して誤った検証を行うことになります。ロジャーが言ったように

+0

本当に小さなシステムのため、XSDに変更するのは面白いとは思わないが、私はそれを調べるだろう。 –

+1

厳密にはそうではない。代替注文を許可することができます。許可するすべてのものを明示的にリストするだけです。 XMLスキーマとDTDで許可されている順序付けルールには大きな違いはありませんが、スキーマ内で表現するのは簡単ではありません。 –

8

DTDで発生制約を持つ順序なしリストを宣言すると、しばしば長いか複雑な宣言が出ます。これの大きな理由の1つは、DTDが決定論的でなければならないため、XMLスキーマに切り替えるだけでも必ずしも役立たないということです。ここ

を含む要素<level>のDTD宣言である:任意の可能な順序で

  • 正確に1つの<file>素子
  • 0-1 <fileName>要素
  • 0-1 <fileNumber>要素

コード:

<!ELEMENT level ((file, ((fileName, fileNumber?) | (fileNumber, fileName?))?) 
       |(fileName, ((file, fileNumber?) | (fileNumber, file))) 
       |(fileNumber, ((file, fileName?) | (fileName, file))))> 
6

あなたは妥当性についてはあまり気にしない場合は、ANYキーワードを使用することができます。

<!ELEMENT level ANY> 

を、私は同様の問題hereに直面している、この2例が表示されることがあります

<Instructors> 
    <Lecturer> 
    </Lecturer> 
    <Professor> 
    </Professor> 
</Instructors> 

<Instructors> 
    <Lecturer> 
    </Lecturer> 
    <Professor> 
    </Professor> 
</Instructors> 

私が見つけた唯一の解決策はこれでした:

<!ELEMENT Instructors ANY> 

おそらくもっと良い解決策がありますが、それは私の特定の問題でうまくいきます。

+6

<!ELEMENTインストラクター(講師|教授)*> –

+0

そうですね。一年前に私は良いアイデアを見つけることができませんでした。 – rendon

+1

あなたはJennifer WidomのスタンフォードデータベースMOOCのXMLエクササイズをしていたようです...同じ問題のために私はここにいます:-) <!ELEMENTインストラクター(講師|教授)*> xmllintからもうエラーは出ません。 –

0

あなたの要素の子供の数が分かりやすい上限を推測できる場合は、問題を解決する方法が非常に汚いです。したがって、あなたが要素「myUnorderedElementは」型オプション1、オプション2またはオプション3のいずれかの0-3人の子供を持つことができるよう

<!ELEMENT myUnorderedElement ((option1 | option2 | option3)?, (option1 | option2 | option3)?, (option1 | option2 | option3)? > 

:0-3の子供たちのための例に従います。

関連する問題