2016-04-27 14 views
1

I XML haben, die statistischen Daten enthält, sieht es wie folgt aus:C# xml Deserialisierung DataContractSerializer mit unbekanntem Format

<?xml version="1.0"?> 
-<response> 
<responsecode>0</responsecode> 
<count>2</count> 
-<statistics> 
<id>id</id> 
<msisdn>somemsisdn</msisdn> 
</statistics> 
-<statistics> 
<id>otherid</id> 
<msisdn>othermsisdn</msisdn> 
</statistics> 
</response> 

ich versuche, es zu deserialisieren, aber wenn es mehr als zwei Datensätze sind - mehr Elemente werden hinzugefügt, und sieht so aus, als ob sie nicht in irgendeiner Art von Liste oder Array deserialisiert werden können, dh ich kenne das genaue Format von XML nicht.

Hier ist mein Code:

[DataContract(Name = "response", Namespace = "")] 
    class XMLStat 
    { 
     [DataMember(Order = 0)] 
     public int responsecode; 
     [DataMember(Order = 1)] 
     public int count; 
     [DataMember(Order = 2)] 
     public List<StatElement> statistics; 
     //public XMLStat() { statistics = new List<StatElement>(); } 
    } 

    [CollectionDataContract(ItemName="statistics", Namespace="")] 
    class StatElement 
    { 
     [DataMember(Order = 0)] 
     public string id; 
     [DataMember(Order = 1)] 
     public string msisdn; 
    } 

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(someurl); 
      string result = string.Empty; 
      DataContractSerializer ser = new DataContractSerializer(typeof(XMLStat)); 
      XMLStat stat = new XMLStat(); 
      using (var s = req.GetResponse().GetResponseStream()) 
       stat = (XMLStat)ser.ReadObject(s); 

Es serialisiert Response und zählen, aber Liste ist leer. Bin ich in meiner Annahme richtig, dass dies keine Liste ist (und gibt es einen Workaround), oder mache ich etwas falsch?

+0

Ich denke, Sie brauchen '[XmlArray]' und '[XmlArrayItem]' Attribute für die 'List' –

+0

@MikeDebela, es scheint nicht zu funktionieren. Ich versuchte dieses: 'Klasse XMLStat { [DataMember (Auftrag = 0)] public int responsecode; [DataMember (Order = 1)] public int Anzahl; [XmlArray (Order = 2, ElementName = "statistics")] öffentliche Liste Statistiken; } [Datacontract (Name = "Statistik")] Klasse StatElement { [XmlArrayItem] public string id; [XmlArrayItem] öffentliche Zeichenfolge msisdn; } ' – Jamil

Antwort

0

Mit XmlSerializer, wird dies erfolgreich deserialisiert die Eingabe:

Sie diesen Eingang xml haben Angenommen:

string xmlText = "<?xml version='1.0'?> " + 
    "<response>" + 
    "<responsecode>0</responsecode>" + 
    "<count>2</count>" + 
    "<statistics>" + 
     "<id>id</id>" + 
     "<msisdn>somemsisdn</msisdn>" + 
    "</statistics>" + 
    "<statistics>" + 
     "<id>otherid</id>" + 
     "<msisdn>othermsisdn</msisdn> " + 
    "</statistics>" + 
    "</response> "; 

Und Ihre Klassen:

[XmlRoot("response")] 
    public class XMLStat 
    { 
    public int responsecode; 
    public int count; 
    [XmlElement("statistics")] 
    public List<StatElement> statistics; 
    } 

    public class StatElement 
    { 
    public string id; 
    public string msisdn; 
    } 

dann die Deserialisierung:

XMLStat obj = new XMLStat(); 
var ser = new XmlSerializer(typeof(XMLStat)); 
using (var strReader = new StringReader(xmlText)) 
using (var reader = XmlReader.Create(strReader)) 
{ 
    obj = (XMLStat)ser.Deserialize(reader); 
} 
+0

sieht aus wie es funktioniert. Ich habe nicht das ganze xml (es hat einige andere Felder), jetzt gibt es mir Fehler in diesem Element: 2016-04-27 15:42:50, Ausnahme ist: Es ist ein Fehler in XML-Dokument (13, 43). 13,43 ist das Ende dieses Attributs, also habe ich keine Ahnung, wie es dort Fehler sein kann. Wie auch immer, danke, zumindest jetzt versucht es Statistiken zu serialisieren) – Jamil