2009-04-21 58 views
139

he visto null elementos representados de varias maneras:¿Cuál es la forma correcta de representar elementos XML nulos?

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

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

El elemento de está presente, pero representado como un elemento vacío (que creo que es incorrecto 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 <null/> niño (de TStamper abajo):

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

¿Hay una correcta, o forma canónica para representar un valor null? ¿Hay formas adicionales a los ejemplos anteriores?

El XML de los ejemplos anteriores está ideado, así que no lea demasiado. :)

Respuesta

98

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

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

Desde: The W3C

de esquemas XML: Estructuras introduce un mecanismo para la señalización de un elemento debe ser aceptado como · válida · cuando no tiene contenido pesar de un tipo contenido que no requiere o incluso necesariamente permite contenido vacío. Un elemento puede ser · válido · sin contenido si tiene el atributo xsi: nil con el valor verdadero. Un elemento así etiquetado debe estar vacío, pero puede llevar atributos si está permitido por el tipo complejo correspondiente.

Una aclaración:
Si usted tiene un elemento book xml y uno de los elementos secundarios es el libro: la serie tiene varias opciones a la hora de llenarlo:

  1. la eliminación del elemento del todo - esto puede hacerse cuando desee indicar que la serie no se aplica a este libro o que el libro no es parte de una serie. En este caso, xsl transforma (u otros procesadores basados ​​en eventos) que tienen una plantilla que coincide con el libro: nunca se invocará la serie. Por ejemplo, si su xsl convierte el elemento de libro en una fila de tabla (xhtml: tr), puede obtener el número incorrecto de celdas de tabla (xhtml: td) utilizando 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. Se llamará a cualquier transformación xsl (u otro analizador basado en evernt) que coincida con el libro: serie. El valor de current() será "". Obtendrá el mismo número de etiquetas xhtml: td utilizando este método como con el siguiente descrito.
  3. Usando xsi: nil = "true" - Esto significa que el elemento book: series es NULL, no solo está vacío. Su transformación xsl (u otro analizador basado en eventos) que tenga una plantilla que coincida con el libro: se llamará a la serie. El valor de current() estará vacío (no cadena vacía). La principal diferencia entre este método y (2) es que el tipo de esquema del libro: series no necesita permitir que la cadena vacía ("") sea un valor válido. Esto no tiene sentido para un elemento de serie, pero para un elemento de lenguaje que se define como un tipo enumerado en el esquema, xsi: nil = "true" permite que el elemento no tenga datos. Otro ejemplo sería elementos de tipo decimal. Si desea que estén vacíos, puede unir una cadena enumerada que solo permita "" y un decimal, o utilice un decimal que sea anulable.
+11

Usando xsi: nil es correcta, pero debe asegurarse de que se encuentra dentro del espacio de nombres adecuado: xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance" – STW

+0

En realidad es 'xmlns: xsi =" ht tp: //w3.org/2001/XMLSchema-instance "'. Tenga en cuenta la falta de http: //. Es importante porque la cadena del espacio de nombres en realidad es solo una cadena para el analizador xml y no un uri. –

+9

Heh, creo que todavía está un poco mal. Debe ser 'xmlns: xsi =" http://www.w3.org/2001/XMLSchema-instance "'. Tenga en cuenta "www.". Ver http://www.w3.org/TR/xmlschema-1/#no-xsi –

8

Depende de cómo valide su XML. Si utiliza la validación del esquema XML, la forma correcta de representar los valores null es con el atributo xsi:nil.

[Source]

2

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

lo tanto, decir que tiene un archivo XML de su aplicación "ReportMaster" la versión 1.

Ahora en la versión 2 ReportMaster una se han añadido algunos atributos que pueden no más o definir.

Si utiliza la representación 'no tag means null' obtiene una compatibilidad automática hacia atrás para leer su archivo xml de ReportMaster 1.

4

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

+0

Si en una aplicación de publicación de documentos desea que la fecha en la página de título predeterminada a la fecha actual si el elemento no tiene contenido, omitir el elemento 'fecha' no es de mucha ayuda, ya que la aplicación no tendrá idea de dónde en el página de título que quiere que aparezca la fecha. (Si el elemento omitido tiene solo una ubicación posible, esto no es un problema, en vocabularios de documentos reales casi todos los elementos tienen muchas ubicaciones posibles). –

4

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

Si necesita información más sofisticada, los esquemas GML añadir el atributo nilReason, por ejemplo: en GeoSciML:

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

Cuando intercambia datos, el rol para el cual se usa 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. Conocer la razón por la cual faltaba el contenido puede ser muy importante.

A los científicos también les preocupa por qué falta información. Por ejemplo, si se descartó por razones de calidad, es posible que desee ver los datos incorrectos originales.

9

No hay respuesta canónica, ya que XML no tiene ningún concepto nulo. Pero supongo que quieres mapear Xml/Object (ya que los gráficos de objetos tienen nulos); entonces la respuesta para usted es "lo que sea que use su herramienta". Si escribes manejo, eso significa lo que prefieras. Para herramientas que usan XML Schema, xsi:nil es el camino a seguir. Para la mayoría de los mapeadores, omitir el elemento/atributo correspondiente es la forma de hacerlo.

5

La documentación en el enlace W3

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

dice que esto son las formas recomendadas.

<test></test> 
<test/> 

El atributo mencionado en la otra respuesta es el mecanismo de validación y no una representación del estado. Por favor, consulte el esquema de http://www.w3.org/TR/xmlschema-1/#xsi_nil

XML: Estructuras introduce un mecanismo para la señalización de un elemento debe ser aceptado como · válida · cuando no tiene contenido pesar de un tipo contenido que no requiere ni siquiera necesariamente permitir contenido vacío . Un elemento puede ser · válido · sin contenido si tiene el atributo xsi: nil con el valor verdadero. Un elemento así etiquetado debe ser vacío, pero puede llevar atributos si lo permite el tipo complejo correspondiente.

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

Esa es la recomendación para los elementos * empty *; ¿Eres de la opinión de que vacío === nulo? Creo que hay una diferencia entre los dos, aunque a menudo es situacional. Si está diciendo que son iguales, recomendaría mencionar ese argumento en su respuesta. –

+0

Vacío no es lo mismo que nulo; si lo fuera, esta pregunta de stackoverflow nunca se habría hecho. Esta respuesta es incorrecta Sin embargo, el programador debe determinar si la lógica que leerá el xml está preparada para manejar un elemento faltante o xsi: nil; si no, podría ser necesario usar una de estas formas; es decir, puede ser necesario perder la distinción entre elemento nulo/faltante y un elemento vacío. – ToolmakerSteve

+0

@RobHruska Sí, tienes razón, es la definición de un elemento vacío, pero si tomas en consideración la definición del W3C apuntada por KitsuneYMG, define que el elemento debe ser nulo y creo que esa representación es más una definición de la etiqueta luego la representación de su estado actual, por lo que no estoy de acuerdo con esa respuesta, y creo que el vacío es la mejor representación de un elemento nulo. La idea es simple, para mantener una buena estructura, necesita que todos los elementos estén representados; de lo contrario, no sabría de su existencia y, por lo tanto, podría tergiversarla. – Oakcool

Cuestiones relacionadas