web-dev-qa-db-fra.com

XML se soucie-t-il de l'ordre des éléments?

XML me trouble parfois, mais j'essaie de comprendre cela. Ce que le vendeur me dit n'a pas de sens, mais encore une fois, XML et moi ne nous entendons pas :)

J'envoie du code XML au service Web d'un fournisseur qui me donne des échecs aléatoires:

<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>

Il n'y a pas de XSLT ou XSD à comparer pour voir si mon XML est valide.

Le fournisseur déclare que le code XML n'est pas valide car le pilote n ° 4 se situe dans la mauvaise zone. XPath for Driver doit être root/Request/Driver et le véhicule est root/Request/Vehicle. 

Est-il courant que des analyseurs syntaxiques XML forcent un ordre d'élément, en particulier s'il n'y a pas de XSD avec lequel comparer le XML? L'assistance du fournisseur tardant à revenir avec moi, je souhaite donc connaître les bonnes pratiques courantes.

Suivre

Je me suis suffisamment plaint auprès de notre responsable des comptes de ne pas être en mesure de le tester (et j'ai eu l’impression qu’ils essayaient simplement d’obtenir de l’argent de support), il s’est avéré que les développeurs avaient le XSD, mais le support n’en a pas. Donc j'avais parlé au mauvais groupe * facepalm *

J'ai le XSD, et il impose un ordre spécifique d'éléments. 

Maintenant, les combattre en ce qui concerne leur propre échantillon XML ne suit pas le schéma, mais au moins maintenant, j'ai quelque chose à tester. 

26
dragonmantank

S'il n'y a pas de schéma XSD (XML) à portée de main, il vous suffit de vérifier si votre code XML est bien formé. 

Dans votre cas, ça l'est. Il n'y a pas de balises XML qui se chevauchent, aucune balise XML laissée ouverte ou quoi que ce soit de ce genre.

Si le fournisseur doit appliquer des éléments tels que l'ordre dans le code XML, il doit fournir un fichier XSD - sinon, ses "exigences" ne peuvent pas être validées et vérifiées ....

19
marc_s

Le compositeur de schéma XML "séquence" appliquera l'ordre

Je sais que c'est vieux mais je suis juste tombé sur le poste.

Jusqu'à aujourd'hui, je répondrais probablement à la question Does XML care about the order of elements? avec No, unless you use a poorly written xml parser.

Cependant, aujourd'hui, une application tierce s'est plainte de l'invalidité des fichiers XML que j'ai créés. Ils utilisent un fichier XSD pour valider le xml. Et oui, vous pouvez appliquer l'ordre ou les éléments dans un fichier 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>

Le mot clé est xs:sequence

L'élément sequence spécifie que les éléments enfants doivent apparaître dans une séquence. Chaque élément enfant peut être compris entre 0 et un nombre quelconque de fois.

ce qui contraste avec xs:all qui ne se soucie pas de l'ordre mais n'autorise que les éléments qui apparaissent zéro ou une fois.

Spécifie que les éléments enfants peuvent apparaître dans n'importe quel ordre. Chaque élément enfant peut se produire 0 ou 1 fois

(Les mots sequence et all sont tous deux ce qu'on appelle un Compositor dans la définition du schéma XML.)

19
Jürgen Steinblock

Les schémas XML peuvent appliquer l'ordre des éléments. S'il n'y a pas de schéma, ni ordre, ni balises, ni structure générale, le type de texte (s'il s'agit d'un nombre ou autre) est prescrit de quelque manière que ce soit - en théorie. Bien sûr que ce n'est pas le cas ici.

Il est parfaitement possible d'analyser * des données XML sans se soucier de l'ordre, mais cela peut être plus facile (par exemple, lorsque vous utilisez SAX, j'imagine, ou lorsque vous êtes un bâtard paresseux qui écrit du code très bâclé) à analyser si vous prenez un certain ordre. . Bien qu'ils devraient inclure un schéma s'ils veulent un certain ordre, il est parfaitement possible que leur analyseur s'y étouffe de toute façon. Oui, ils ne devraient pas faire cela, mais visiblement ils s'en moquent.

* Par "analyser", je ne veux pas dire "prendre ce document XML et le transformer, par exemple, en un DOM", mais "prendre cet exemple, par exemple, et en extraire les informations".

3
user395760

Les fournisseurs feront ce qu’ils vont faire, mais c’est une application non standard de XML qui repose sur la commande.

XML est déclaratif, pas procédural. Donc, cela ne devrait pas être "par étapes".

3
Buggieboy

L'accès à XML par DOM préserve l'ordre des nœuds tels qu'ils sont dans votre document XML. Regardez ici:

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

là vous trouvez: 

Un objet liste de noeuds représente une liste des noeuds, dans le même ordre que dans le XML.

Si votre service Web utilise confiance, la commande est une question différente - cela dépend ou non de la mise en œuvre du service Web. 

2
Doc Brown

Un schéma XML peut ou non appliquer l'ordre des éléments. Cela dépend du schéma en question. De manière plus générale, l'ordre des éléments XML n'a pas d'importance, sauf indication contraire du schéma approprié.

2
Reinderien

Eh bien, je pense que la meilleure réponse possible est de leur demander. Ils pourraient même analyser votre code XML en tant que fichier texte. Vous devrez peut-être des sauts de ligne et un ordre "correct" d'attributs.

S'ils analysaient correctement cet ordre, cela n'aurait pas d'importance (du moins pas en termes de demandes valides). À mon avis, ils devraient créer deux tables et les joindre avec les identifiants fournis.

0
Nux