0

我有一些来自 3rd 方 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; }
    }

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

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

4

2 回答 2

1

删除类根并反序列化数组本身(也将s​​ubscriber_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;
}
于 2012-07-27T02:15:51.873 回答
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; }
    }

我刚刚用你的样品测试了上面的内容,它加载得很好。

于 2013-04-27T07:35:30.453 回答