2011-08-30 20 views
9

En cuanto a mi otra pregunta: XML deserialize null elements?XML, ¿qué es esto: elemento nulo o vacío?

Tengo elementos como estos desde un servidor de terceros para las pruebas API:

<Taxable /> 
<DefaultPurchasePrice /> 

me he dado cuenta de que ahora estoy confundiendo a mí mismo acerca de si elementos como que representan un objeto nulo o vacío.

Hablando de objetos, son lo mismo, objeto nulo normalmente significa referencia de objeto vacío ¿no? Pero tratando de mapear un elemento XML a un campo/valor de datos, podrían ser diferentes, es decir, una cadena vacía es una cadena vacía, pero para el precio decimal o el valor booleano no están definidos, lo que equivale a vacío, pero no serán nulos, a menos que estén definidos como nulo.

Una vez más, el problema con mi XmlSerializer es que no manejaría la transferencia de un elemento vacío como ese. podría arreglarlo fácilmente en mi código ¿O debería preguntar a las personas que el XML tiene un XML bien definido? Porque parece que un elemento XML vacío como ese no está definido: está aquí, pero podría ser nulo o vacío, ¿no importa para el elemento XML en sí mismo? Pero para ese elemento mi código necesita resolver cómo lidiar con eso, a menos que configure todos mis campos de datos de clase C como un tipo de cadena. De lo contrario, si mi código intenta asignar directamente un elemento XML vacío o nulo a un determinado campo de datos, se producirá un error.

Tengo que hacer esta pregunta porque encontré que XML tiene muchos de esos elementos y para esos elementos especiales, mi código de .NET XMLserialization necesita mapear esos campos como una cadena y si la cadena no está vacía, los caso en tipo de datos correspondiente, de lo contrario, los configuré como nulos. Y termino eliminando esos elementos vacíos antes de hacer mi deserialización porque es mucho más fácil. Pero deambulo: "¿Qué estoy haciendo realmente en mi código? ¿Acabo de eliminar los elementos nulos o los elementos vacíos? ¡Porque son claramente diferentes! Pero las personas que escriben ese XML piensan que son iguales, porque XML en sí mismo no tiene concepto de 'nulo', y algunas personas argumentan que es mi responsabilidad de decidir si es nulo o vacío Pero XML que no permiten represent 'null' elements in a clearer way

Editar:.

En el ejemplo que presenté, esos dos elementos claramente debe ser nulo en lugar de elementos vacíos. XML no tiene realmente un concepto de nulo, pero esos elementos podrían omitirse (si son nulos, no ponerlos en XML) o utilizar una mejor representación como se mencionó be @svick . O en otros casos, vacío los elementos deben usarse cuando tengan sentido. Pero no para Decimal o Boolean.

+2

Una etiqueta de elemento vacía es XML válido. Cómo interpretas, nulo, vacío o lo que sea, depende totalmente de ti. – fpmurphy1

+1

@fmurphy: esa debería ser una respuesta ... Lo hubiera votado –

+0

@fpmurphy, ¿entonces es un elemento vacío? –

Respuesta

15

< gravable/>
< DefaultPurchasePrice/>

¿qué es esto: elemento nulo o vacío?

Está vacío. Es semánticamente el mismo que:

<Taxable></Taxable> 
<DefaultPurchasePrice></DefaultPurchasePrice> 

El único concepto "nulo" que existe en XML es un elemento que falta. No puede especificar un elemento y decir que es nulo, utilizando la semántica de XML. Debe tener algún tipo de esquema (un esquema explícito, como DTD, XSD o Schematron, o un esquema implícito/lógico) para hacer esto.

Esto no restringe una aplicación que interpreta el XML, o las tecnologías oficiales relacionadas con XML. Por ejemplo, XSD tiene un atributo xsi:nil="true". Aunque puede aplicar algunos de estos atributos de esquema al XML, esos atributos no son XML "puros"; Son una adición proporcionada por esquemas XSD.

Este es un caso donde XSD era libre de construir su propia semántica sobre la estructura XML básica, y agregar un nil explícito donde no existía uno. Esta flexibilidad se considera una ventaja de XML.

+0

Otra excelente explicación. Casi estoy de acuerdo palabra por palabra. Pero 'xsi: nil =' ture '' está construido en declaraciones para el esquema Xml, y puedes usar eso para presentar un elemento 'nulo'. Es algo así como decir que sin bibliotecas, C# no podría hacer nada. Pero, de nuevo, mi comprensión de XML es limitada: D –

+0

@pstar: aclarado y corregido un poco.Por favor, avíseme si esto es mejor, peor o lo mismo :) –

+0

gracias, parece más claro. Pero tengo una pregunta más ahora. No estoy seguro acerca de la relación de xmlns: xsi y XSD, ¿tengo que tener xmlns: xsi como mínimo para usar XSD, y así obtener xsi: nill y algunos otros atributos incorporados de forma gratuita? –

2

Creo que esto se debe al hecho de que no existe una asignación predeterminada entre XML y el modelo de objetos de su idioma favorito. Considere el siguiente código XML:

<Person Name="John"> 
    <Father> 
     <Person Name="Jim" /> 
    </Father> 
    <Mother> 
     <Person Name="Jenny" /> 
    </Mother> 
</Person> 

¿Se Person tienen propiedades (o campos) y FatherMother? ¿O Person representa una colección que puede contener objetos de los tipos Father y Mother (quizás heredando del tipo base abstracto FamilyMember)? Esto no está claro en el XML, y depende de usted cómo lo represente en su modelo de objetos. (La presencia del esquema cambiaría eso un poco, pero aún deja espacio para la interpretación.)

De manera similar, el concepto de null no está presente en XML. Por otro lado, el concepto de elemento vacío no se asigna directamente al modelo de objetos. Y no son lo mismo, el elemento vacío aún puede tener atributos y tiene un "tipo" (nombre del elemento).

En general, creo que una buena solución es tener un elemento XML especial que represente null (<Null />), pero otra solución podría tener más sentido en su caso específico.

+0

Explicado muy bien. ¿Cuál es otra solución que mencionaste en el último párrafo? –

+0

Puede usar los elementos vacíos como usted mencionó. O podrías dejar de lado esa propiedad por completo. O tal vez incluso algo así como un atributo: 'isEmpty =" true "'. – svick

+1

En realidad, hay otra buena solución para representar en 'nulo' ('xsi: nil = "verdadero"'), vea esto: http://stackoverflow.com/questions/774192/what-is-the-correct-way-to -representar-null-xml-elementos. –

Cuestiones relacionadas