none
XMLで子要素の出現順を順不同にしたい RRS feed

  • 質問

  • DTD付きのXMLを XmlReader を使ってバリデーションチェックしています。

    親要素Aに対して、子要素X, Y, Z が1づつあり、DTDで

    <!ELEMENT A (X , Y , Z)>

    とすると、正しく処理できるのですが、これだと子要素の出現順が X ⇒ Y ⇒ Z の順番に固定されてしまいます。
    これを順不同にしたいので、いろいろとネットを検索したところ

    接続演算子 & を使って

    <!ELEMENT A (X & Y & Z)>

    といればよいようなことが書かれてありました。しかし、このようにDTDを定義すると

    「'?'、'*'、または '+' を指定してください。 行 4、位置 29 です。」

    と受け付けてくれません。

    .NET 標準のXMLパーサーでは無理なのでしょうか?

    ネットで検索したら、すべての組み合わせをパイプでつなぐやり方

    <!ELEMENT A ((X , Y , Z) | (X , Z , Y) | ... | (Z , Y , X)) >

    を見ましたが、こんなやり方しかないのでしょうか?

    どなたか詳しい方、ご教示ください。

    2014年10月21日 8:59

回答

  • DTDでは基本不可能だと思います。
    なおDTDはすでに時代遅れな技術仕様なので、XML Schemaを使うようにしたほうが良いと思われます。
    http://www.atmarkit.co.jp/fxml/tecs/036xsd/36.html
    • 回答としてマーク Ticky4649 2014年10月22日 0:14
    2014年10月21日 9:28

すべての返信

  • DTDでは基本不可能だと思います。
    なおDTDはすでに時代遅れな技術仕様なので、XML Schemaを使うようにしたほうが良いと思われます。
    http://www.atmarkit.co.jp/fxml/tecs/036xsd/36.html
    • 回答としてマーク Ticky4649 2014年10月22日 0:14
    2014年10月21日 9:28
  • syghさん

    レスありがとうございました。

    >DTDでは基本不可能だと思います。
    やっぱりそうなんですね。接続演算子 & の件はいまいちよくわかりませんでしたが、パーサーが対応していないんでしょう。きっと。

    >なおDTDはすでに時代遅れな技術仕様なので、XML Schemaを使うようにしたほうが良いと思われます。
    はい。おっしゃる通りなんですが。なにせお客さまという絶対君主がおりますので、当方の意向通りには
    いかないところが何とも苦しいところで、古い技術だろんが何だろうが使わなくてはいけない立場でして。。。
    DTDも今回初めてじっくりと仕様をみましたが、こんな簡単なこともできないのかといきなりつまづいた次第です。
    子要素の出現順は固定でいきたいと思います。リンクまで貼っていただきありがとうございました。

    2014年10月22日 0:14