2012-05-15 7 views
9

Ich versuche, einige XML aus einem Webdienst in C# POCOs zu deserialisieren. Ich habe das funktioniert für die meisten Eigenschaften, die ich brauche, aber ich muss eine bool Eigenschaft basierend darauf, ob ein Element vorhanden ist oder nicht, aber kann nicht zu sehen, wie dies zu tun?Deserialize XML-Elementpräsenz zu bool in C#

Ein Beispiel XML-Schnipsel:

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

Eine C# Klasse Beispiel:

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

Dies ist ein sehr vereinfachtes Beispiel für die tatsächliche XML und Objekthierarchie I Verarbeitung bin, zeigt aber, was ich versuche ich zu erreichen.

Alle anderen Fragen, die ich im Zusammenhang mit Deserialisierung Null/leere Elemente gelesen habe, scheinen die Verwendung von Nullable<T>, die nicht das tut, was ich brauche.

Hat jemand irgendwelche Ideen?

Antwort

12

Eine Möglichkeit wäre, eine andere Eigenschaft zu verwenden, um den Wert des Elements abzurufen, und dann mithilfe der Target-Eigenschaft herauszufinden, ob dieses Element vorhanden ist. Wie so.

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

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

Wie auch wenn ein leeres Element vorhanden ist, wird nicht die TempProperty null sein, so Ziel true zurück, wenn <target />

+0

Danke, hat es übertrieben :) –

0

existiert Können Sie erklären, warum Sie Nullable-Typen verwenden möchten nicht?
Wenn Sie eine int-Eigenschaft (im Gegensatz zu int?) In ur ​​poco definieren, repräsentiert sie nicht wirklich die zugrunde liegende XML-Datei, und Sie erhalten einfach die Standardwerte für diese Variablen.
wenn u annehmen, pflegen Sie leer/null Strings oder Zahlen mit dem Wert 0 in ur xml erhalten, verwendet YouCan die Methode Balthy für jede der ur-Eigenschaften vorgeschlagen, oder use the method described here


ich denke Generell seine eine bessere Idee Erstellen eines Schemas zum Beschreiben von ur xml und Erstellen von darauf basierenden Klassen bei Verwendung von Nullable-Typen, wenn Sie wirklich möchten, dass Ihre Klassen die zugrunde liegenden Daten darstellen.

+0

Ich deserialisiere Ergebnisse von einer Google Search Appliance. Ein Element '' ist im '' Element vorhanden, wenn die Ergebnisse automatisch gefiltert werden, und nicht vorhanden, wenn dies nicht der Fall ist. Ich muss eine Eigenschaft festlegen, um anzugeben, ob eine Ergebnismenge gefiltert ist oder nicht - ich sehe nicht, wie eine Nullable Bool in diesem Fall helfen wird? –

+0

Die NULL-Werte, die in diesem Fall verwendet werden, sind für die Eigenschaft TISELF, nicht für den Booleschen Wert, der angibt, ob er leer ist/null oder nicht. Wenn du dich nicht um den Inhalt von FI kümmerst und nur überprüfen willst, ob es da ist oder nicht, dann wird die Balthys-Methode funktionieren. NULL-fähige Eigenschaften sollten für komplexere Szenarien verwendet werden, wenn der Wert, den Sie überprüfen möchten, eine Zahl oder irgendetwas anderes ist, das in der Instanz der Klasse, die Sie verwenden, einen Standardwert ungleich null erhält. Wäre ein numerischer Typ, sagen wir eine Ganzzahl, und würden wir int FI in der Klasse verwenden, hätte es immer den Wert 0, was NICHT dasselbe ist wie null. – YavgenyP

+0

Danke, ich verstehe, was Nullable sind für. In diesem Zusammenhang wären sie jedoch nicht besser als einen beliebigen Werttyp mit dem einfachen Null-Check, den Balthy vorschlägt. Das '' Element hat nie einen Wert - es ist einfach das Vorhandensein des Elements, das etwas darstellt. Also wäre der Wert von 'Nullable ' immer 'default (T)' oder null. –