2012-05-15 11 views
9

Estoy tratando de deserializar algunos XML de un servicio web en C# POCO. Tengo esto funcionando para la mayoría de las propiedades que necesito, sin embargo, necesito establecer una propiedad bool según si un elemento está presente o no, pero parece que no veo cómo hacerlo.Deserializar la presencia de elementos XML para bool en C#

Un fragmento de XML de ejemplo:

<someThing test="true"> 
    <someThingElse>1</someThingElse> 
    <target/> 
</someThing> 

Un ejemplo de clase C#:

[Serializable, XmlRoot("someThing")] 
public class Something 
{ 
    [XmlAttribute("test")] 
    public bool Test { get; set; } 

    [XmlElement("someThingElse")] 
    public int Else { get; set; } 

    /// <summary> 
    /// <c>true</c> if target element is present, 
    /// otherwise, <c>false</c>. 
    /// </summary> 
    [XmlElement("target")] 
    public bool Target { get; set; } 
} 

Este es un ejemplo muy simplificado de la jerarquía XML y objeto real Estoy procesamiento, pero demuestra lo que yo estoy tratando de lograr

Todas las demás preguntas que he leído relacionadas con la deserialización de elementos nulos/vacíos parecen implicar el uso de Nullable<T>, que no hace lo que necesito.

¿Alguien tiene alguna idea?

Respuesta

12

Una forma de hacerlo sería usar una propiedad diferente para obtener el valor del elemento, luego use la propiedad Target para determinar si ese elemento existe. Al igual que.

[XmlElement("target", IsNullable = true)] 
public string TempProperty { get; set; } 

[XmlIgnore] 
public bool Target 
{ 
    get 
    { 
     return this.TempProperty != null; 
    } 
} 

ya que incluso si existe un elemento vacío, el TempProperty no será nulo, por lo que volverá Objetivo true si existe <target />

+0

Gracias, estaba demasiado pensado :) –

0

Puede explicar por qué usted no desea utilizar tipos anulables?
Cuando define una propiedad int (en oposición a int?) En ur poco, realmente no representa el xml subyacente, y obtendrá simplemente los valores predeterminados para esas variables.
si u suponer que usted no conseguirá cadenas vacías/null o enteros con el valor 0 en ur xml, youcan utiliza el método Balthy sugiere para cada uno de ur propiedades, o use the method described here


En general, creo que es una mejor idea para crear un esquema para describir tu xml y generar clases basadas en él, al usar tipos con nulos, si realmente quieres que tus clases representen los datos subyacentes.

+0

Estoy deserializando los resultados de un Google Search Appliance. Un elemento '' está presente en el elemento '' si los resultados se filtran automáticamente y no están presentes si no lo están. Necesito establecer una propiedad para indicar si un conjunto de resultados está filtrado o no - ¿No veo cómo un bool nullable ayudará en esta instancia? –

+0

Los nulables que se utilizan en tal caso son para la propiedad en sí, no el booleano que marca si está vacío/nulo o no. Si no le importa el contenido de FI y solo quiere verificar si está allí o no, entonces el método de balthys hará el trabajo. Los derechos anulables se deben usar para escenarios más avanzados, cuando el valor que exista desea verificar es un número o cualquier otra cosa que obtendrá un valor predeterminado, no nulo, en el caso de la clase que usa. SI era un tipo numérico, digamos entero, y usaría int FI en su clase, siempre tendría el valor de 0, que NO es lo mismo que nulo. – YavgenyP

+0

Gracias, entiendo para qué son los Nullable. Sin embargo, en este contexto, no serían mejores que usar cualquier tipo sin valor con la simple comprobación nula que sugiere Balthy. El elemento '' nunca tiene un valor; simplemente es la presencia del elemento que representa algo. Por lo tanto, el valor de 'Nullable ' siempre será 'predeterminado (T)' o nulo. –

Cuestiones relacionadas