2012-01-03 51 views
5

¿Los analizadores/deserializadores XML en general son capaces de diferenciar entre nillable elements explicitly set to null and optional elements that are left out?¿Los analizadores XML dicen la diferencia entre xsi: nil = "true" y elementos omitidos?

Supongamos que tenemos el siguiente tipo de complejo:

<complexType name="NiceType"> 
    <sequence> 
    <element name="niceElem" nillable="true" type="int" minOccurs="0" /> 
    </sequence> 
</complexType> 

Elemento establecer explícitamente a null (ejemplo 1):

<niceType> 
    <niceElem xsi:nil="true"/> 
</niceType> 

Elemento omite (ejemplo 2):

<niceType> 
</niceType> 

Los analizadores sintácticos en general, como las implementaciones JAX-B o .NET similares, como el módulo XML de WCF, pueden decir la diferencia entre el ejemplo 1 y el ejemplo 2 anterior? En otras palabras, ¿podría combinar de manera interoperable ambas representaciones NULL, como en el ejemplo, para comunicar diferentes tonos de NULL?

+2

Excelente redacción - * "diferentes tonos de NULL" * - sería un nombre decente de la banda! –

+1

Una gran idea, un tanto nerdie band pero de todos modos :) – nize

Respuesta

2

analizadores XML (por ejemplo XmlReader, XmlDocument, XDocument) no tratan especialmente xsi:nil - todavía ver el elemento en la corriente/documento.

XmlSerializer maneja xsi:nil: dentro de ese contexto, significa lo mismo que un nodo omitido; puede hacer que WCF serialice usando XmlSerializer marcando su DataContract s usando XmlSerializerFormatterAttribute.

DataContractSerializer usa el atributo: sin embargo, no estoy seguro de cuáles son las reglas para usarlas (un caso es circular references) - es mucho más probable que omita elementos. No creo que deba pasar xsi:nil a DataContractSerializer a menos que lo use en ese caso, ya que DataContractSerializer está diseñado según suposiciones para mejorar el rendimiento de de/serialización.

Desde el spec parece que fue diseñado originalmente para trabajar como el JavaScript null y undefined - donde null (xsi:nil) es un valor válido y undefined (omitido) es la totalidad de la inexistencia de un valor; especialmente con tipos complejos: puede proporcionar el elemento pero omitirlo (incluso si el contenido es obligatorio según el esquema).

En general, lo evitaría. No es intuitivo: no creo haber visto una API REST/SOAP que lo use (excepto InfoPath que lo usa exclusivamente); la mayoría solo usa null = undefined. La declaración y el uso de xmlns también consumen algunos bytes valiosos adicionales.

una calificación especial: Si comete un elemento opcional y no es anulable (por ejemplo xsd:int) del generador C# proporciona una propiedad <Name>Specified - usted puede añadir sus propias propiedades como esta. Esto le permitiría diferenciar entre xsi:nil y omittance (nil cuando se especifica y nulo, se omite cuando no se especifica). Sin embargo, esto solo funciona con XmlSerializer.

+2

La razón por la que me gustaría combinar nillable = "true" y minOccurs = "0" es poder enviar mensajes de actualización (en llamadas al servicio web) en los que puede distinguir entre qué elementos NO actualizar y qué actualizar y cuáles eliminar. Los elementos que no deben actualizarse, en ese diseño, se omiten.Consulte [esta publicación] (http://stackoverflow.com/questions/8709715/how-to-use-optional-attributes-in-web-service-update-messages-dtos). Tu opinión me hace dudar de ese enfoque. – nize

+2

Qué tal: ' '. Personalmente, creo que 'xsi: nil' es maloliente; por exactamente la misma razón por la que tuvo que hacer una pregunta al respecto: no está claro qué significa exactamente; y el soporte API es irregular en el mejor de los casos. Sin embargo, el bit de bonificaciones lo resolverá (además de 'XmlSerializerFormatter'). –

+0

La compatibilidad con Spotty API no es algo bueno en términos de servicios SOA. Gracias por señalar eso. Es esencial que los marcos de WS heterogéneos puedan analizarlo correctamente. La propuesta que realiza es similar a la alternativa * Alt 2.1 * en [esta publicación] (http://stackoverflow.com/questions/8709715/how-to-use-optional-attributes-in-web-service-update-messages -dtos). Un argumento en contra de tener atributos de acción en los elementos podría ser que desordene sus tipos de "documentos comerciales" con verbos relacionados con la operación que debería aplicarse sobre ellos. – nize

Cuestiones relacionadas