2016-04-27 3 views
1

У меня есть XML, который содержит статистические данные, это выглядит следующим образом:C# XML десериализация с использованием DataContractSerializer с неизвестным форматом

<?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> 

Я пытаюсь десериализации, но если есть более двух записей - больше элементов будут добавлено и выглядит так, что их нельзя десериализовать в каком-то списке или массиве, т. е. я не знаю точного формата XML.

Вот мой код:

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

Он упорядочивает responsecode и сосчитать, но список пуст. Я прямо в своем предположении, что это не список (и есть ли какое-либо обходное решение), или я делаю что-то неправильно?

+0

Я думаю, вам нужны '[XmlArray]' и '[XmlArrayItem]' атрибуты для 'List' –

+0

@MikeDebela, похоже, что это не работает. Я пробовал это: 'class XMLStat { [DataMember (Order = 0)] public int responsecode; [DataMember (Order = 1)] public int count; [XmlArray (Order = 2, ElementName = "статистика")] public List статистика; } [DataContract (Name = "Статистика")] класс StatElement { [XmlArrayItem] общественности строка идентификатор; [XmlArrayItem] public string msisdn; } ' – Jamil

ответ

0

Использование XmlSerializer, это будет успешно десериализации вход:

Если у вас есть этот входной XML:

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> "; 

И классы:

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

Тогда десериализации:

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

похоже, что он работает. Я не размещал весь xml (у него есть другие поля), теперь он дает мне ошибку в этом элементе: 2016-04-27 15:42:50, exception is: В документе XML есть ошибка (13, 43). 13,43 - это конец этого атрибута, поэтому я понятия не имею, как это может быть ошибка. В любом случае, спасибо, по крайней мере сейчас он пытается сериализовать статистику) – Jamil

Смежные вопросы