2012-05-15 11 views
9

Sto tentando di deserializzare alcuni XML da un servizio Web in P # COC. Ho questo funzionamento per la maggior parte delle proprietà di cui ho bisogno, tuttavia, ho bisogno di impostare una proprietà bool in base al fatto che un elemento sia presente o meno, ma non riesco a vedere come farlo?Deserializzare la presenza dell'elemento XML in bool in C#

Un frammento di esempio XML:

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

Un esempio C# classe:

[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; } 
} 

Questo è un esempio molto semplificato della gerarchia XML e l'oggetto reale io sono l'elaborazione, ma dimostra quello che ho sto cercando di ottenere.

Tutte le altre domande che ho letto relative alla deserializzazione di elementi null/vuoti sembrano implicare l'uso di Nullable<T>, che non fa ciò di cui ho bisogno.

Qualcuno ha qualche idea?

risposta

12

Un modo per farlo sarebbe utilizzare una proprietà diversa per ottenere il valore dell'elemento, quindi utilizzare la proprietà Target per ottenere se quell'elemento esiste. Così.

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

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

Come anche se un elemento vuoto esiste, il TempProperty non sarà nullo, così bersaglio tornerà true se <target /> esiste

+0

Grazie, era troppo pensieroso :) –

0

Può spiegare perché non avete intenzione di utilizzare i tipi nullable?
Quando si definisce una proprietà int (in opposizione a int?) In ur ​​poco, non rappresenta realmente l'xml sottostante e otterrete semplicemente i valori predefiniti per tali variabili.
se u supporre che si voleva ottenere stringhe vuote/null o interi con il valore 0 in ur xml, youcan utilizzato il metodo Balthy suggerito per ciascuno di ur proprietà, o use the method described here


In generale credo che la sua migliore idea per creare uno schema per descrivere ur xml e generare classi basate su di esso, mentre si usano i tipi nullable, se si vuole veramente che le classi rappresentino i dati sottostanti.

+0

Sto deserializzando i risultati di Google Search Appliance. Un elemento '' è presente nell'elemento '' se i risultati sono auto-filtrati e non presenti se non lo sono. Ho bisogno di impostare una proprietà per indicare se un set di risultati è filtrato o meno - Non vedo come un bool nullable possa essere d'aiuto in questa istanza? –

+0

I valori nulli che vengono utilizzati in questo caso sono per la proprietà tiself, non il booleano che contrassegna se è vuoto/nullo o no. se non ti interessa il contenuto di FI e vuoi solo controllare se è lì o no, allora il metodo Balthys farà il lavoro. Le proprietà nullable dovrebbero essere utilizzate per scenari più avanzati, quando il valore che si vuole verificare è un numero o qualsiasi altra cosa che otterrà un valore predefinito, non nullo, nell'istanza della classe che usa. IF era un tipo numerico, ad esempio integer, e usava int FI nella classe ur avrebbe sempre il valore di 0, che NON è lo stesso di null. – YavgenyP

+0

Grazie, ho capito a cosa servono i Nullable. Tuttavia, in questo contesto, non sarebbero migliori di usare qualsiasi tipo non di valore con il semplice controllo nullo suggerito da Balthy. L'elemento '' non ha mai un valore - è semplicemente la presenza dell'elemento che rappresenta qualcosa. Quindi il valore di 'Nullable ' sarebbe sempre 'default (T)' o null. –

Problemi correlati