Xml反序列化还是格式错误?

时间:2012-07-26 21:52:55

标签: .net xml serialization xml-serialization

我有来自第三方API的XML,如下所示:

<root>
  <Data>
    <sub_id>3</sub_id>
    <email>something@something.test</email>
  </Data>
  <Data>
    <sub_id>7</sub_id>
    <email>test@what.biz</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; }
    }

但当然这不起作用。 如果我插入一个元素来包装“数据”元素的数组,那么我已经注释掉了“Datas”,它会修复它,但我不能。正如我所说的,这个XML来自第三方(对XML的工作方式有点松懈)。

这对于一些不同的C#代码/属性是否可行?

2 个答案:

答案 0 :(得分:1)

删除类根并反序列化数组本身(也将class_id重命名为类Data中的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解析它,它更有效率(在我的机器上100万次反序列化时为10秒20秒):

var xml =
@"<root>
  <Data>
    <sub_id>3</sub_id>
    <email>something@something.test</email>
  </Data>
  <Data>
    <sub_id>7</sub_id>
    <email>test@what.biz</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;
}

答案 1 :(得分: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; }
    }

我刚刚用你的样品测试了上面的内容并装得很好。