2010-12-01 15 views
20

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が無効であることをベンダが示しています。ドライバのXPathはroot/Request/Driverで、Vehicleはroot/Request/Vehicleです。

特にXMLを比較するXSDがない場合、XMLパーサーが要素の順序を強制するのは一般的ですか?ベンダーのサポートは私のところに戻っていくのが遅いので、よくある実践が何であるか知りたい。

私はこれをテストすることができないについて、当社のアカウント担当者に十分な訴え(そしてそれは、彼らはお金だけをサポート取得しようとしていたような音製)それは開発者がXSDを持っていることが判明していること

フォローサポートはしません。だから私は間違ったグループ* facepalmに話していた*

私はXSDを手に入れ、要素の特定の順序を強制します。

今では、自分のサンプルに関してXMLと戦うために、XMLはスキーマに従わないが、少なくとも今は何かをテストする必要がある。

+1

ベンダは、XSDまたは要素の順序を含むXML形式に関するソフトウェアの前提条件についての詳細なサポート文書を提供する必要があります。さもなければ、あなたは推測する必要があります。 XML文書を読み取るソフトウェアは、(可能な場合)注文を実施すべきではありませんが、それは珍しいことではありません。 XSD *は、インターチェンジ形式の規則を明示的に定義するドキュメンテーションです。 http://kettle.pentaho.com/も参照してください。 –

答えて

16

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

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

ベンダーがXML内の順序のようなものを強制する必要がある場合、彼はXSDファイルを提供するべきである - そうでない場合は、彼の「必要条件」は、検証と確認することはできませんが....

+1

それはまさに私が思ったことであり、私は確信したかったのです。私たちが作成したXMLパーサーは上のXMLでうまく動作し、エラーは発生しませんが、XSDを使用しないとどのように実際に確認できますか? – dragonmantank

+1

DTD(ベンダーが古代のツールセットを使用している場合)も妥当性を判断できます。 – brianary

2

XMLスキーマは、要素の順序を強制してもしなくてもよい。それは問題のスキーマに依存します。最も一般的な意味では、XML要素の順序は、適切なスキーマによって別途指定されない限り、重要ではありません。

3

ベンダーは、彼らが意志行いますそれは注文に依存するXMLの非標準的なアプリケーションです。

XMLは手続き型ではなく宣言型です。だから、それは "段階的"であってはならない。

+5

あなたの段落は、入力した順序でレンダリングされます! – brianary

+0

@brianaryの素晴らしい点。私はXHTMLの段落に、その順序を示す属性が付いているのを見たことがありません! –

3

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

オーダーを気にすることなく* XMLデータを解析することは可能ですが、SAXを使用している場合や、怠惰なコードを書いている怠け者の場合など、一定の順序をとる。彼らは特定の順序が欲しいならば、にはが含まれていなければなりませんが、パーサーがそれを頼りにする可能性は十分にあります。はい、彼らはこれをしてはいけませんが、明らかに彼らは気にしません。

*「解析する」とは、「そのXMLドキュメントを取り出して、例えばDOMに変換する」という意味ではなく、「例えばDOMを取り出してそこから情報を抽出する」という意味ではありません。

2

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

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

をあなたが見つける:

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

Webサービスは、順番にを頼るある場合は別の問題である - それはよく、またはない場合があり、Webサービスの実装に依存しています。

0

私は可能な限り最善の答えがあると思います。 XMLをテキストファイルとして解析することさえできるので、改行や属性の「正しい」順序が必要な場合があります。

これを正しく解析するならば、順序は問題にならないでしょう(少なくとも有効な要求ではない)。私が見ているように、彼らは2つのテーブルを構築し、それらを提供されたIDで結合するべきです。

11

私はこれが古いことを知っていますが、私はちょうどその投稿に来ました。

今日まで、私が最も可能性が高いNo, unless you use a poorly written xml parser

で質問Does XML care about the order of elementsに答えるだろうしかし、今日のサードパーティのアプリケーションは、私が作成した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

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

xs:allとは対照的に、これは順序を気にせず、0または1回だけ出現する要素のみを許容します。

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

関連する問題