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

j'ai vu null éléments représentés de plusieurs façons:

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é comme un élément vide (ce qui me semble erroné puisque" vide " 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 présent dans la markup retourné :

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

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

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

Existe-t-il une façon correcte ou canonique de représenter une telle valeur null ? Existe-il d'autres moyens que les exemples ci-dessus?

le XML pour les exemples ci-dessus est inventé, alors ne le lisez pas trop loin. :)

147
demandé sur Community 2009-04-21 23:24:56

7 réponses

xsi:nil est la bonne façon de représenter une valeur telle que: Lorsque L'appel DOM Niveau 2 getElementValue () est émis, la valeur nulle est retournée. xsi: nil est également utilisé pour indiquer un élément valide sans contenu, même si ce type de contenu n'autorise pas normalement les éléments vides.

si une étiquette vide est utilisée, getElementValue () renvoie la chaîne vide ("") Si la balise est omise, alors aucune balise auteur n'est même présente. Cela peut être sémantiquement différent le paramètre " nil " (Ex. Le fait de fixer "série" à zéro peut signifier que le livre n'appartient à aucune série, tandis que le fait d'omettre la série peut signifier que la série est un élément inapplicable à l'élément courant.)

De: , Le W3C,

XML Schema: Structures introduit un mécanisme pour la signalisation d'un l'élément doit être accepté comme valide· quand il n'a pas de contenu malgré un type de contenu qui ne nécessite pas ou même permet nécessairement le contenu vide. Un élément peut être ·valide· sans le contenu s'il a l'attribut xsi:nil avec la valeur true. Un élément étiqueté doit être vide, mais peut porter des attributs si autorisé par le type complexe correspondant.

Une clarification:

Si vous avez un élément XML livre et que l'un des éléments enfant est book:series, vous avez plusieurs options pour le remplir:

  1. Retrait de l'élément entièrement - Ce qui peut être fait lorsque vous souhaitez indiquer que la série ne s'applique pas à ce livre ou ce livre ne fait pas partie d'une série. Dans ce cas, xsl transforme (ou tout autre processeur basé sur un événement) qui a un modèle qui correspond à book:series ne sera jamais appelé. Par exemple, si votre xsl transforme l'élément book en table row (xhtml:tr), vous pouvez obtenir le nombre incorrect de cellules de table (XHTML:td) en utilisant cette méthode.
  2. quitter l'élément vide-cela pourrait indiquer que la série est "", ou 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 du courant() va être "". Vous obtiendrez le même nombre de balises XHTML:td en utilisant cette méthode qu'avec la suivante décrite.
  3. utilisant xsi: nil= "true" - cela signifie que l'élément book:series est nul, pas seulement vide. Votre transform XSL (ou autre analyseur basé sur un événement)) qui ont un livre de correspondance de modèle:série sera appelé. La valeur du courant() est vide (pas de chaîne vide). La principale différence entre cette méthode et (2) est que le type schema de book:series n'a pas besoin d'autoriser la chaîne vide ("") comme valeur valide. Cela n'a aucun sens pour un élément de série, mais pour un élément de langue qui est défini comme un type énuméré dans le schéma, xsi:nil="true" permet à l'élément d'avoir aucune donnée. Un autre exemple serait des éléments de type décimal. Si vous voulez qu'ils soient vides vous pouvez unir une chaîne énumérée qui permet seulement "" et une décimale, ou utiliser une décimale qui est nillable.
103
répondu KitsuneYMG 2014-04-09 13:39:40

il n'y a pas de réponse canonique, puisque XML n'a fondamentalement pas de concept nul. Mais je suppose que vous voulez Xml / Object mapping (puisque les graphes objets ont nulls); donc la réponse pour vous est "quel que soit l'usage de votre outil". Si tu écris handling, ça veut dire ce que tu préfères. Pour les outils qui utilisent le schéma XML, xsi:nil est la voie à suivre. Pour la plupart des mappers, omettre l'élément/attribut correspondant est la façon de le faire.

9
répondu StaxMan 2015-11-04 19:25:09

cela dépend de la façon dont vous validez votre XML. Si vous utilisez la validation de schéma XML, la bonne façon de représenter les valeurs null est avec l'attribut xsi:nil .

[ Source ]

8
répondu Tormod Fjeldskår 2009-04-21 19:32:28

la documentation dans le lien w3

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

dit que ce sont les recommandés formes.

<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

XML Schéma: Structures introduit un mécanisme pour signaler qu'un l'é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 nécessairement laisser vide contenu. Un élément peut être * valide· sans contenu s'il a attribut xsi: nil avec la valeur true. un élément ainsi étiqueté doit être vide , mais peut porter des attributs si autorisé par le correspondant type complexe.

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>
5
répondu Oakcool 2015-11-05 23:41:02

vous utilisez xsi:nil lorsque la sémantique de votre 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 terrible, mais ça ressemble à neuf sortes de mauvais pour moi. Chaque format XML avec lequel j'ai travaillé représente des valeurs nulles en omettant l'élément. (Ou attribut, et bonne chance pour marquer un attribut avec xsi:nil .)

4
répondu Robert Rossney 2009-04-22 03:48:48

il suffit d'omettre l'attribut ou l'élément fonctionne bien dans les données moins formelles.

si vous avez besoin d'informations plus sophistiquées, les schémas GML ajoutent l'attribut nilReason, par exemple: dans 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 relatives à des valeurs manquantes; il peut s'agir de les raisons standard GML ( missing, inapplicable, withheld, unknown ), ou le texte préparé par other: , ou peut être un lien URI à une explication plus détaillée.

lorsque vous échangez des données, le rôle pour lequel le XML est couramment utilisé, les données envoyées à un destinataire ou pour un but donné peuvent avoir un contenu obscurci qui serait disponible à quelqu'un d'autre qui a payé ou avait une authentification différente. Il peut être très important de connaître la raison pour laquelle il manquait du contenu.

Les scientifiques s'inquiètent également des raisons pour lesquelles l'information est manquante. Par exemple, s'il a été abandonné pour des raisons de qualité, ils peuvent vouloir voir les mauvaises données originales.

4
répondu Andy Dent 2009-04-23 03:44:58

dans de nombreux cas, le but D'une valeur nulle est de servir pour une valeur de données qui n'était pas présente dans une version précédente de votre application.

alors dites que vous avez un fichier xml de votre application" ReportMaster " version 1.

maintenant dans la version 2 de ReportMaster a quelques autres attributs ont été ajoutés qui peuvent ou non être définis.

si vous utilisez la représentation "no tag means null" Vous obtenez la rétrocompatibilité automatique pour lire votre fichier XML ReportMaster 1.

2
répondu Jeroen Dirks 2009-04-21 19:42:45