将复杂的XML反序列化为C#对象

本文关键字:对象 反序列化 XML 复杂 | 更新日期: 2023-09-27 18:23:44

我有这种格式的XML-

<Areas>
  <Area>
    <Property Name="Test11">a1</Property>
    <Property Name="Test12">a2</Property>
    <Property Name="Test13">a3</Property>
    <Property Name="Test14">a4</Property>
    <Property Name="Test15">a5</Property>
  </Area>
  <Area>
    <Property Name="Test21">b1</Property>
    <Property Name="Test22">b2</Property>
    <Property Name="Test23">b3</Property>
    <Property Name="Test24">b4</Property>
    <Property Name="Test25">b5</Property>
  </Area>
</Areas>

我使用微软提供的xsd.exe作为-生成了这个类

[Serializable()]
    public partial class Areas
    {
        [XmlArrayItem("Property", typeof(AreasAreaProperty))]
        public AreasAreaProperty[][] Area { get; set; }
    }
    [Serializable()]
    public partial class AreasAreaProperty
    {
        [XmlAttribute()]
        public string Name { get; set; }
        [XmlText()]
        public string Value { get; set; }
    }

反序列化的代码是-

private void Deserialize()
        {
            XmlSerializer xs = new XmlSerializer(typeof(Areas));
            FileStream fs = new FileStream("XMLFile1.xml", FileMode.Open);
            XmlReader xr = new XmlTextReader(fs);
            Areas a = (Areas)xs.Deserialize(xr);
            fs.Close();
        }

但是,在取消诽谤的时候,我犯了这个错误-无法将类型"AreasAreaProperty[]"转换为"AreasAreaProperty"我在创建XMLSerializer的对象时收到了这个错误。

如何解决这个问题??提前谢谢。。

将复杂的XML反序列化为C#对象

我想我以前见过这个。XSD.exe并不完美,因此您需要稍微修改一下结果。在下面的代码中,在您有[][]的最后一行,删除其中一个[],使其成为"public AreasAreaProperty[]Area…"

[Serializable()]
public partial class Areas
{
    [XmlArrayItem("Property", typeof(AreasAreaProperty))]
    public AreasAreaProperty[][] Area { get; set; }

我过去也遇到过类似的问题,看看这些问题的答案:

  • XML反序列化为XSD生成的类的问题

  • .NET xsd导入程序创建不可序列化的类

如果您了解您的模式,那么应该尝试将其添加到xsd中,而不是将所有内容都留给xsd.exe工具。

你的Deserialize()方法的第四行不是应该是吗

    Areas a = (Areas)xs.Deserialize(xr); 

而不是

    Area a = (Area)xs.Deserialize(xr); 

因为你的根元素是。