web-dev-qa-db-fra.com

Quelle est la bonne façon de représenter des éléments XML nuls?

J'ai vu null éléments représentés de plusieurs manières:

L'élément est présent avec xsi:nil="true":

 <book>
     <title>Beowulf</title>
     <author xsi:nil="true"/>
 </book>

L'élément est présent, mais représenté sous la forme d'un élément vide (ce qui, à mon avis, est erroné car 'empty' et null sont sémantiquement différents):

 <book>
     <title>Beowulf</title>
     <author/>
 </book>

 <!-- or: -->
 <book>
     <title>Beowulf</title>
     <author></author>
 </book>

L'élément n'est pas du tout présent dans le balisage renvoyé :

 <book>
     <title>Beowulf</title>
 </book>

L'élément a un élément enfant <null/> (de TStamper ci-dessous):

 <book>
     <title>Beowulf</title>
     <author><null/></author>
 </book>

Existe-t-il un moyen correct ou canonique de représenter une telle valeur null? Existe-t-il d'autres moyens que les exemples ci-dessus?

Le XML pour les exemples ci-dessus est artificiel, ne le lisons donc pas trop loin. :)

157
Rob Hruska

xsi: nil est le moyen correct de représenter une valeur telle que: Lorsque l'appel du niveau 2 de get getElementValue () est émis, la valeur NULL est renvoyée. xsi: nil est également utilisé pour indiquer un élément valide sans contenu, même si ce type de contenu n'autorise normalement pas les éléments vides.

Si une balise vide est utilisée, getElementValue () renvoie la chaîne vide (""). Si la balise est omise, aucune balise auteur n'est même présente. Cela peut être sémantiquement différent que de le définir sur "nil" (par exemple, si vous définissez "Série" sur nil, le livre n'appartient à aucune série, alors que l'omission de séries peut signifier que la série est un élément inapplicable à l'élément actuel.)

De: Le W3C

Schéma XML: Les structures introduisent un mécanisme pour signaler qu'un élément doit être accepté comme · valide · lorsqu'il n'a pas de contenu malgré un type de contenu qui n'exige pas, voire ne permet même pas, un contenu vide. Un élément peut être · valide · sans contenu s'il possède l'attribut xsi: nil avec la valeur true. Un élément ainsi étiqueté doit être vide, mais peut porter des attributs si le type complexe correspondant le permet.

Une clarification:
Si vous avez un élément book xml et que l’un des éléments enfants est book: series, vous avez plusieurs options pour le remplir:

  1. Suppression totale de l'élément - Vous pouvez le faire si vous souhaitez indiquer que la série ne s'applique pas à ce livre ou que le livre ne fait pas partie d'une série. Dans ce cas, les transformations xsl (ou autres processeurs basés sur des événements) ayant un modèle correspondant à book: series ne seront jamais appelées. Par exemple, si votre xsl transforme l'élément book en ligne de tableau (xhtml: tr), vous risquez d'obtenir un nombre incorrect de cellules de tableau (xhtml: td) à l'aide de cette méthode.
  2. Laisser l'élément vide - Cela peut indiquer que la série est "", inconnue ou que le livre ne fait pas partie d'une série. Toute transformation xsl (ou tout autre analyseur basé sur evernt) qui correspond à book: series sera appelée. La valeur de current () sera "". Vous obtiendrez le même nombre de balises xhtml: td en utilisant cette méthode que la suivante.
  3. Utilisation de xsi: nil = "true" - Cela signifie que l'élément book: series est NULL, pas seulement vide. Votre transformation xsl (ou un autre analyseur basé sur un événement) ayant un livre de correspondance de modèle: la série sera appelée. La valeur de current () sera vide (pas une chaîne vide). La principale différence entre cette méthode et (2) est que le type de schéma book: series n'a pas besoin d'autoriser la chaîne vide ("") en tant que valeur valide. Cela n'a aucun sens pour un élément de série, mais pour un élément de langage défini comme un type énuméré dans le schéma, xsi: nil = "true" n'autorise aucune donnée pour l'élément. Un autre exemple serait les éléments de type décimal. Si vous voulez qu'elles soient vides, vous pouvez associer une chaîne énumérée ne permettant que "" et une décimale, ou bien utiliser une décimale qui est nillable.
111
KitsuneYMG

Il n'y a pas de réponse canonique, puisque XML n'a fondamentalement pas de concept null. Mais je suppose que vous voulez un mappage Xml/Object (puisque les graphes d’objets ont des valeurs NULL); la réponse pour vous est donc "tout ce que votre outil utilise". Si vous écrivez la manipulation, cela signifie ce que vous préférez. Pour les outils qui utilisent un schéma XML, xsi:nil est la voie à suivre. Pour la plupart des mappeurs, omettre l'élément/l'attribut correspondant est le moyen de le faire.

9
StaxMan

Cela dépend de la façon dont vous validez votre XML. Si vous utilisez la validation de schéma XML, la manière correcte de représenter les valeurs null consiste à utiliser l'attribut xsi:nil.

[ Source ]

8
Tormod Fjeldskår

La documentation dans le lien w3

http://www.w3.org/TR/REC-xml/#sec-starttags

dit que ce sont les formes recommandées.

<test></test>
<test/>

L'attribut mentionné dans l'autre réponse est un mécanisme de validation et non une représentation d'état. Veuillez vous référer au http://www.w3.org/TR/xmlschema-1/#xsi_nil

Schéma XML: les structures introduisent un mécanisme pour signaler qu'un élément doit être accepté comme · valide · lorsqu'il n'a pas de contenu malgré un type de contenu qui ne nécessite pas ou même autoriser nécessairement un contenu vide. Un élément peut être · valide · sans contenu s'il possède l'attribut xsi: nil avec la valeur true. Un élément ainsi libellé doit être vide , mais peut porter des attributs si le type complexe correspondant le permet.

Pour clarifier cette réponse: Contenu

  <Book>
    <!--Invalid construct since the element attribute xsi:nil="true" signal that the element must be empty-->
    <BuildAttributes HardCover="true" Glued="true" xsi:nil="true">
      <anotherAttribute name="Color">Blue</anotherAttribute>
    </BuildAttributes>
    <Index></Index>
    <pages>
      <page pageNumber="1">Content</page>            
    </pages>
    <!--Missing ISBN number could be confusing and misguiding since its not present-->
  </Book>
</Books>
6
Oakcool

Vous utilisez xsi:nil lorsque votre sémantique de schéma indique qu'un élément a une valeur par défaut et que la valeur par défaut doit être utilisée si l'élément n'est pas présent. Je dois supposer qu'il y a des gens intelligents pour qui la phrase précédente n'est pas une idée en soi terrible, mais cela ressemble à neuf sortes de mauvaises choses pour moi. Chaque format XML avec lequel j'ai travaillé représente des valeurs null en omettant l'élément. (Ou attribut, et bonne chance pour marquer un attribut avec xsi:nil.)

4
Robert Rossney

Le simple fait de supprimer l'attribut ou l'élément fonctionne bien dans des données moins formelles.

Si vous avez besoin d'informations plus sophistiquées, les schémas GML ajoutent l'attribut nilReason, par exemple: in GeoSciML :

  • _xsi:nil_ avec la valeur "true" est utilisé pour indiquer qu'aucune valeur n'est disponible
  • nilReason peut être utilisé pour enregistrer des informations supplémentaires sur les valeurs manquantes; il peut s'agir de l'une des raisons GML standard (_missing, inapplicable, withheld, unknown_) ou de texte précédé de _other:_, ou peut être un lien URI vers une explication plus détaillée.

Lorsque vous échangez des données, le rôle pour lequel XML est couramment utilisé, les données envoyées à un destinataire ou à une fin donnée peuvent avoir un contenu masqué qui serait disponible pour une autre personne ayant effectué une authentification payante ou différente. Connaître la raison pour laquelle le contenu était manquant peut être très important.

Les scientifiques s'inquiètent également de la raison pour laquelle l'information manque. Par exemple, si elle a été supprimée pour des raisons de qualité, ils peuvent vouloir voir les données incorrectes d'origine.

4
Andy Dent

Dans de nombreux cas, l'objectif d'une valeur Null est de servir une valeur de données qui n'était pas présente dans une version précédente de votre application.

Supposons donc que vous avez un fichier XML de votre application "ReportMaster" version 1.

Maintenant, dans la version 2 de ReportMaster, quelques attributs supplémentaires ont été ajoutés qui peuvent ou non être définis.

Si vous utilisez la représentation "no tag signifie null", vous obtenez une compatibilité ascendante automatique pour la lecture de votre fichier XML ReportMaster 1.

2
Jeroen Dirks