web-dev-qa-db-ja.com

XMLは要素の順序を考慮しますか?

XMLは時々私を混乱させますが、私はこれを理解しようとしています。ベンダーが私に言っていることは意味がありませんが、XMLと私はうまくいきません:)

ベンダーのWebサービスに送信するXMLがあり、ランダムなエラーが発生しています。

<root>
    <Request>
        <Driver id="1" VehId="1">...</Driver>
        <Driver id="2" VehId="1">...</Driver>
        <Driver id="3" VehId="2">...</Driver>
        <Vehicle id="1">...</Vehicle>
        <Vehicle id="2">...</Vehicle>
        <Driver id="4" VehId="2">...</Driver>
    </Request>
</root>

XMLが有効かどうかを確認するために比較するXSLTまたはXSDはありません。

ベンダーは、ドライバー#4が間違った領域にあるため、XMLは無効であると述べています。 DriverのXPathはroot/Request/Driverで、Vehicleはroot/Request/Vehicleです。

特にXMLと比較するXSDがない場合、XMLパーサーが要素の順序を強制することは一般的ですか?ベンダーのサポートが遅いので、よくある慣行を教えてください。

フォローアップ

私は、これをテストできないことについて(そして、彼らが単にサポート金を得ようとしているように聞こえたように)私たちのアカウント担当者に十分に不満を述べました。だから私は間違ったグループと話していました* facepalm *

XSDを取得しましたが、要素の特定の順序を強制します。

独自のサンプルXMLに関して彼らと戦うためにスキーマに準拠していませんが、少なくとも今はテストする必要があります。

34
dragonmantank

手元にXSD(XMLスキーマ)がない場合、確認できるのは、XMLが整形式であるかどうかだけです。

あなたの場合-それはそうです。重複するXMLタグ、開いたままのXMLタグ、またはそのようなものはありません。

ベンダーがXML内での注文などを強制する必要がある場合は、XSDファイルを提供する必要があります。そうでない場合、ベンダーの「要件」を検証およびチェックできません。

20
marc_s

XMLスキーマコンポジター「シーケンス」は順序付けを強制します

私はこれが古いことを知っていますが、私はポストに出くわしました。

今日まで、私はDoes XML care about the order of elements?の質問にNo, unless you use a poorly written xml parser.で答える可能性が高いです

しかし、今日、サードパーティのアプリケーションから、私が作成したxmlファイルが無効であるとの不満がありました。 XSDファイルを使用してXMLを検証します。そしてはい、xsdファイル内の順序または要素を強制できます。

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="ComplexType">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" default="" name="Value1" type="xs:string" />
      <xs:element minOccurs="0" maxOccurs="1" default="" name="Value2" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>

キーワードは xs:sequence

Sequence要素は、子要素がシーケンスに現れる必要があることを指定します。各子要素は、0から任意の回数発生できます。

これは xs:all とは対照的です。これは順序を気にせず、ゼロまたは1回だけ発生する要素を許可します。

子要素を任意の順序で表示できることを指定します。各子要素は0回または1回発生します

sequenceallはどちらも Compositor と呼ばれるもので、 XMLスキーマ定義。)

32

XMLスキーマは要素の順序を強制できます。スキーマがない場合、順序もタグも一般的な構造もテキストの種類(それが数値などの場合)ではなく、理論的には規定されています。もちろん、ここではそうではありません。

順序を気にせずにXMLからデータを解析*することは完全に可能ですが、特定の順序であると仮定すると、解析が簡単になります(たとえば、SAXを使用している場合や、非常にずさんなコードを書くのが面倒な場合)。 。特定の順序が必要な場合はshouldにスキーマが含まれますが、パーサーがいずれにせよそれを詰まらせる可能性は十分にあります。はい、彼らはこれをすべきではありませんが、明らかに気にしません。

*「解析」とは、「そのXMLドキュメントを取得して、それをDOMなどに変換する」という意味ではなく、「DOMを取得して、そこから情報を抽出する」という意味です。

3
user395760

ベンダーは彼らがすることをするでしょうが、それは注文に依存するXMLの非標準のアプリケーションです。

XMLは手続き型ではなく、宣言型です。したがって、「段階的」であってはなりません。

3
Buggieboy

DOMでXMLにアクセスすると、XMLドキュメントでのノードの順序が維持されます。ここを見て:

http://www.w3schools.com/dom/dom_nodes_nodelist.asp

そこで見つけます:

ノードリストオブジェクトは、XMLと同じ順序でノードのリストを表します。

Webサービスが注文に依存している場合は別の質問です。Webサービスの実装によって異なります。

2
Doc Brown

XMLスキーマは要素の順序を強制する場合としない場合があります。問題のスキーマによって異なります。最も一般的な意味では、適切なスキーマで特に指定されていない限り、XML要素の順序は重要ではありません。

2
Reinderien

まあ、私は最良の答えは、彼らに尋ねることだと思います。 XMLをテキストファイルとして解析している可能性もあるため、改行と「正しい」属性の順序が必要になる場合があります。

それらが正しく解析される場合、順序は重要ではありません(少なくとも有効な要求に関しては)。私が見ると、2つのテーブルを作成し、それらを指定されたIDで結合する必要があります。

0
Nux