¿Cuál es la forma correcta de representar elementos XML nulos?


He visto null elementos representados de varias maneras:

El elemento está presente con xsi:nil="true":

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

El elemento está presente, pero representado como un elemento vacío (que creo que está mal ya que 'vacío' y null son semánticamente diferentes):

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

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

El elemento no está presente en absoluto en el marcado devuelto :

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

El elemento tiene un elemento secundario <null/> (de TStamper abajo):

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

¿Existe una forma correcta o canónica de representar tal null valor? ¿Hay formas adicionales que los ejemplos anteriores?

El XML de los ejemplos anteriores es artificial, así que no leas demasiado. :)

Author: Community, 2009-04-21

7 answers

Xsi: nil es la forma correcta de representar un valor tal que: Cuando se emite la llamada a nivel 2 del DOM getElementValue (), se devuelve el valor NULL. xsi: nil también se usa para indicar un elemento válido sin contenido, incluso si ese tipo de contenido de elementos normalmente no permite elementos vacíos.

Si se usa una etiqueta vacía, getElementValue () devuelve la cadena vacía ("") Si la etiqueta se omite, entonces ninguna etiqueta de autor está presente. Esto puede ser semánticamente diferente a configurarlo en ' nil '(Ej. Establecer "Series" en nil puede ser que el libro no pertenezca a ninguna serie, mientras que omitir series podría significar que series es un elemento inaplicable al elemento actual.)

De: El W3C

XML Schema: Structures introduce un mecanismo para señalar que un elemento debe ser aceptado como ·válido· cuando no tiene contenido a pesar de un tipo de contenido que no requiere o incluso permitir necesariamente contenido vacío. Un elemento puede ser ·válido· sin contenido si tiene el atributo xsi: nil con el valor true. Un elemento así etiquetado debe estar vacío, pero puede llevar atributos si está permitido por el tipo complejo correspondiente.

Una aclaración:
Si tiene un elemento book xml y uno de los elementos secundarios es book:series, tiene varias opciones al rellenarlo:

  1. Eliminar el elemento por completo - Esto se puede hacer cuando se desea indicar que la serie no se aplica a este libro o que el libro no es parte de un serie. En este caso, las transformaciones xsl (u otros procesadores basados en eventos) que tengan una plantilla que coincida con book:series nunca se llamarán. Por ejemplo, si su xsl convierte el elemento book en fila de tabla (xhtml:tr) puede obtener el número incorrecto de celdas de tabla (xhtml:td) usando este método.
  2. Dejar el elemento vacío - Esto podría indicar que la serie es "", o es desconocida, o que el libro no es parte de una serie. Cualquier transformación xsl (u otro analizador basado en evernt) que coincida libro: serie se llamará. El valor de current() será"". Obtendrá el mismo número de etiquetas xhtml: td utilizando este método que con el siguiente descrito.
  3. Usando xsi:nil="true" - Esto significa que el elemento book:series es NULO, no solo vacío. Se llamará a su transformación xsl (u otro analizador basado en eventos) que tenga una plantilla que coincida con book:series. El valor de current () estará vacío (no una cadena vacía). La principal diferencia entre este método y (2) es que el esquema tipo de libro: series no necesita permitir la cadena vacía ( "" ) como un valor válido. Esto no tiene sentido para un elemento series, pero para un elemento language que se define como un tipo enumerado en el esquema, xsi:nil="true" permite que el elemento no tenga datos. Otro ejemplo serían los elementos de tipo decimal. Si desea que estén vacíos, puede unir una cadena enumerada que solo permita "" y un decimal, o usar un decimal que sea nillable.
 103
Author: KitsuneYMG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-09 13:39:40

No hay respuesta canónica, ya que XML fundamentalmente no tiene ningún concepto nulo. Pero supongo que quieres mapeo Xml / Objeto (ya que los gráficos de objetos tienen nulos); así que la respuesta para ti es "cualquiera que sea la herramienta que uses". Si escribes manejando, eso significa lo que prefieras. Para las herramientas que utilizan XML Schema, xsi:nil es el camino a seguir. Para la mayoría de los mapeadores, omitir el elemento/atributo coincidente es la forma de hacerlo.

 9
Author: StaxMan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-04 19:25:09

Depende de cómo valides tu XML. Si utiliza la validación de esquemas XML, la forma correcta de representar los valores null es con el atributo xsi:nil.

[Fuente]

 8
Author: Tormod Fjeldskår,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-21 19:32:28

La documentación en el enlace w3

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

Dice que estas son las formas recomendadas.

<test></test>
<test/>

El atributo mencionado en la otra respuesta es mecanismo de validación y no una representación de estado. Véase http://www.w3.org/TR/xmlschema-1/#xsi_nil

XML Schema: Structures introduce un mecanismo para indicar que una elemento debe ser aceptado como ·válido· cuando no tiene contenido a pesar de un tipo de contenido que no requiere o incluso permite necesariamente vacío contenido. Un elemento puede ser * válido * sin contenido si tiene el atributo xsi: nil con el valor true. Un elemento así etiquetado debe ser vacío, pero puede llevar atributos si lo permite el correspondiente tipo complejo.

Para aclarar esta respuesta: Contenido

  <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
Author: Oakcool,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-05 23:41:02

Se usa xsi:nil cuando la semántica del esquema indica que un elemento tiene un valor predeterminado y que el valor predeterminado debe usarse si el elemento no está presente. Tengo que asumir que hay personas inteligentes para quienes la frase anterior no es una idea evidentemente terrible, pero me suena como nueve tipos de malos. Cada formato XML con el que he trabajado representa valores nulos omitiendo el elemento. (O atributo, y buena suerte marcando un atributo con xsi:nil.)

 4
Author: Robert Rossney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-22 03:48:48

Simplemente omitir el atributo o elemento funciona bien en datos menos formales.

Si necesita información más sofisticada, los esquemas GML agregan el atributo nilReason, por ejemplo: in GeoSciML :

  • xsi:nil con un valor de "true" se usa para indicar que no hay ningún valor disponible
  • nilReason se puede utilizar para registrar información adicional para los valores faltantes; esta puede ser una de las razones estándar de GML (missing, inapplicable, withheld, unknown), o texto precedido por other:, o puede ser un enlace URI a explicación detallada.

Cuando está intercambiando datos, el rol para el que se usa comúnmente XML, los datos enviados a un destinatario o para un propósito determinado pueden tener contenido oculto que estaría disponible para otra persona que pagó o tuvo una autenticación diferente. Saber la razón por la que faltaba contenido puede ser muy importante.

A los científicos también les preocupa por qué falta información. Por ejemplo, si se eliminó por razones de calidad, es posible que quieran ver el original datos malos.

 4
Author: Andy Dent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-23 03:44:58

En muchos casos, el propósito de un valor Null es servir para un valor de datos que no estaba presente en una versión anterior de su aplicación.

Así que digamos que tiene un archivo xml de su aplicación "ReportMaster" versión 1.

Ahora en la versión 2 a de ReportMaster se han agregado algunos atributos más que pueden o no definirse.

Si utiliza la representación 'no tag means null' obtendrá compatibilidad automática con versiones anteriores para leer su archivo xml de ReportMaster 1.

 2
Author: Jeroen Dirks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-21 19:42:45