2012-07-26 92 views
0

我有一个第三方API,它看起来像这样一些XML:Xml反序列化或格式不正确?

<root> 
    <Data> 
    <sub_id>3</sub_id> 
    <email>[email protected]</email> 
    </Data> 
    <Data> 
    <sub_id>7</sub_id> 
    <email>[email protected]</email> 
    </Data> 
</root> 

而且我想它反序列化到这样一类:

public class root 
    { 
     //[XmlArray("Datas")] 
     [XmlArrayItem("Data", typeof(Data))] 
     public Data[] Data { get; set; } 
    } 

    public class Data 
    { 
     public int subscriber_id { get; set; } 
     public string email { get; set; } 
    } 

但是,当然,这并未”工作。 如果我插入一个元素来包装'Data'元素的数组,但是我不能,我已经注释到的'Datas'这条线可以解决这个问题。正如我所说的,这个XML来自第三方(对XML的工作方式稍微松懈)。

那么这是可以用一些不同的C#代码/属性吗?

回答

1

删除类根和反序列化数组本身(也将类中的subscriber_id重命名为sub_id)。下面是代码

var serializer = new XmlSerializer(typeof(Data[]), new XmlRootAttribute("root")); 
      Data[] datas; 
      using (var tr = new StringReader(xml)) 
      { 
       datas = (Data[])serializer.Deserialize(tr); 
      } 

但是如果反序列化是所有你需要与源XML格式作为,那么你可以使用XLINQ解析那么简单,它是更有效(10 VS 20秒,我的机器上百万deserializations ):

var xml = 
@"<root> 
    <Data> 
    <sub_id>3</sub_id> 
    <email>[email protected]</email> 
    </Data> 
    <Data> 
    <sub_id>7</sub_id> 
    <email>[email protected]</email> 
    </Data> 
</root>"; 
var xdoc = XDocument.Parse(xml); 
foreach (var dataElem in xdoc.Root.Elements("Data")) 
{ 
    var subId = int.Parse(dataElem.Element("sub_id").Value); 
    var email = dataElem.Element("email").Value; 
} 
+0

不错的工作伙计!我确信这是可能的,因为它看起来像嵌套的xml,但我甚至没有想到这种类型(Data [])的东西。谢谢! – LoveMeSomeCode 2012-07-27 13:35:30

0

xml格式不正确。您只需使用[XmlElement]而不是[XmlArray]。例如:

[XmlRoot("root")] 
    public class Root 
    { 
     [XmlElement] 
     public Data[] Data { get; set; } 
    } 

    public class Data 
    { 
     [XmlElement("sub_id")] 
     public int SubscriberId { get; set; } 

     [XmlElement("email")] 
     public string Email { get; set; } 
    } 

我刚刚测试过上面的样品,它装的很好。