【问题标题】:Xml Deserialization or malformed?Xml反序列化或格式错误?
【发布时间】:2012-07-26 21:52:55
【问题描述】:

我有一些来自 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# 代码/属性是否可行?

【问题讨论】:

    标签: .net xml serialization xml-serialization


    【解决方案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;
    }
    

    【讨论】:

    • 干得好伙计!我确信这是可能的,因为它看起来像正确嵌套的 xml,但我什至没有想到 typeof(Data[]) 的事情。谢谢!
    【解决方案2】:

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

    我刚刚用您的示例测试了上述内容,并且加载正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 2011-08-09
      • 2010-10-17
      相关资源
      最近更新 更多