2016-05-06 8 views
0

Ich mache Web-Anfrage an API von Drittanbietern und möchte diese Antwort dynamisch auf C# -Klasse deserialisieren. Aber es gibt ein Problem, dass ich als Antwort manchmal eine Liste von Objekten und manchmal ein Objekt bekomme.Deserialisierung XML zu C# -Klasse dynamisch

Es gibt mir Fehler wie bereits 'objectClass' ist in Xml vorhanden.

Ich weiß, die Lösung ist: Ich muss verschiedene Klassen für beide Antworten definieren. Gibt es eine andere Option, die dieses XML mit einer Klasse deserialisiert?

Beispielantwort:

<data listtype="objectClass" count="1"> 
    <objectClass> 
    </objectClass> 
</data> 

In anderen Antwort:

<data listtype="objectClass" count="2" totalcount="2" numremaining="0"> 
    <objectClass> 
    <!-- Properties -->   
    </objectClass> 
    <objectClass> 
    <!-- Properties -->   
    </objectClass> 
</data> 

Klasse:

[XmlRoot(ElementName = "data")] 
public class Data 
{ 

    [XmlElement(ElementName = "objectClass")] 
    public objectClass ObjectItem { get; set; }  

    [XmlElement(ElementName = "objectClass")] 
    public List<objectClass> ObjectItemList { get; set; } 
} 

bearbeiten:

A t das Letzte, das ich fand, daß Antwort xml Objektnamen in unterschiedlichem Fall enthält.

Beispielantwort:

<data listtype="objectClass" count="1"> 
    <objectClass> 
    </objectClass> 
</data> 

In anderer Antwort:

<data listtype="OBJECTCLASS" count="2" totalcount="2" numremaining="0"> 
    <OBJECTCLASS> 
    <!-- Properties -->   
    </OBJECTCLASS> 
    <OBJECTCLASS> 
    <!-- Properties -->   
    </OBJECTCLASS> 
</data> 

Ich habe in meiner Datenklasse ein weiteres Element hinzugefügt und es funktioniert jetzt.

[XmlElement(ElementName = "OBJECTCLASS")] 
public List<OBJECTCLASS> ObjectItem { get; set; } 

Antwort

1

Sie können immer die Listenoption verwenden. Wie, wenn Sie ein Objekt haben, wird es ein Element in der Liste sein ...

Sie Ihre Klasse wie folgt ändern:

[XmlRoot(ElementName = "data")] 
public class Data 
{ 
    [XmlElement(ElementName = "objectClass")] 
    public List<objectClass> ObjectItemList { get; set; } 
} 
1

Sie müssen XMLArray und XmlArrayItem verwenden, um die XML-Deserializer zu helfen parse die Objekte in eine ListItems.

[XmlRoot(ElementName = "data")] 
public class Data 
{ 
    [XmlArray("data")] 
    [XmlArrayItem("objectClass")] 
    public List<objectClass> ObjectItemList { get; set; } 
}