繁体   English   中英

嵌套列表C#的XML反序列化

[英]XML-Deserialization of a nested List C#

我正在尝试使用XmlSerializer反序列化Xml文件。 我的文件的一部分看起来像这样:

<bla>
    <ListOfListOfTest>
         <ListOfTest> 
               <Test>       
               </Test>        
        </ListOfTest>        
    </ListOfListOfTest>
</bla>

我尝试了不同的方法,但是没有用。

我的第一次尝试看起来像:

public class bla
    {
        public bla()
        {
            ListOfListOfTest = new List<List<Test>>();
        }
        [...]
        public List<List<Test>> ListOfListOfTest{ get; set; }            
    }

->不起作用。

第二次尝试:

public class bla
    {
        public bla()
        {
            ListOfListOfTest = new List<List<Test>>();
        }
        [..]
        public List<List<Test>> ListOfListOfTest { get; set; }

        [XmlArrayItemAttribute]
        public List<List<Test>> listOfListOfTest { get { return ListOfListOfTest ; } }
    }

->也失败了

第三次尝试:

public class bla
    {
        public bla()
        {
            ListOfListOfTest = new List<Foo>();
        }
        [...]
        public List<Foo> ListOfListOfTest { get; set; }

    }


    public class Foo
    {
        public Foo()
        {
            ListOfTest = new List<Test>();   
        }
        public List<Test> ListOfTest { get; set; }
    }

->失败了...

失败表示XmlSerializerserializer.Deserialize()期间未填充List 我总是得到一个List其中有零个元素。

我究竟做错了什么?

谢谢你的努力

像这样吗

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml.Serialization;

class Program {
    static void Main() {
        var xml = @"<bla>
    <ListOfListOfTest>
         <ListOfTest> 
               <Test>       
               </Test>        
        </ListOfTest>        
    </ListOfListOfTest>
</bla>";
        var bar = (Bar)new XmlSerializer(typeof(Bar)).Deserialize(new StringReader(xml));
        Console.WriteLine(bar.Lists.Sum(_ => _.Items.Count)); // 1
    }
}
[XmlRoot("bla")]
public class Bar {
    [XmlArray("ListOfListOfTest")]
    [XmlArrayItem("ListOfTest")]
    public List<Foo> Lists { get; } = new List<Foo>();
}
public class Foo {
    [XmlElement("Test")]
    public List<Test> Items { get; } = new List<Test>();
}
public class Test { }

实际的布局取决于哪些元素可能重复,以及您是否需要能够复制确切的组织(与仅需要所有Test项目相对)。 在上面的代码中, ListOfListOfTest不应重复,但是可以有任意数量的ListOfTestTest元素。

要掌握正确反序列化后XML的外观,请复制XML:

<bla>
    <ListOfListOfTest>
         <ListOfTest> 
               <Test>       
               </Test>        
        </ListOfTest>        
    </ListOfListOfTest>
</bla>

在C#中创建一个类。 单击顶部的“编辑”,然后将“光标粘贴在类中”,然后单击“选择性粘贴”,然后“将XML粘贴为类”。 Visual Studio将为您正确反序列化XML并创建必要的类。 使用它可以比较您认为需要的内容和实际需要的内容,以便自己了解反序列化应如何工作。

Visual Studio有一个方便的选项-您应该只复制粘贴xml并进入菜单编辑>选择性粘贴>将XML粘贴为类 Visual Studio将生成可用于对XML进行序列化/反序列化的类。 在这种情况下,它将生成:

[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class bla
{
    private blaListOfListOfTest listOfListOfTestField;

    public blaListOfListOfTest ListOfListOfTest
    {
        get { return this.listOfListOfTestField; }
        set { this.listOfListOfTestField = value; }
    }
}

[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class blaListOfListOfTest
{
    private blaListOfListOfTestListOfTest listOfTestField;

    public blaListOfListOfTestListOfTest ListOfTest
    {
        get { return this.listOfTestField; }
        set { this.listOfTestField = value; }
    }
}

[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class blaListOfListOfTestListOfTest
{
    private object testField;

    public object Test
    {
        get { return this.testField; }
        set { this.testField = value; }
    }
}

之后,您可以进行一些调整-例如,删除类型限定符或将属性替换为自动属性(可以通过Visual Studio扩展来完成)。 几次按键后:

[Serializable]
[DesignerCategory("code")]
[XmlType(AnonymousType = true)]
[XmlRoot(Namespace = "", IsNullable = false)]
public partial class bla
{
    public blaListOfListOfTest ListOfListOfTest { get; set; }
}

[Serializable]
[DesignerCategory("code")]
[XmlType(AnonymousType = true)]
public partial class blaListOfListOfTest
{
    public blaListOfListOfTestListOfTest ListOfTest { get; set; }
}

[Serializable]
[DesignerCategory("code")]
[XmlType(AnonymousType = true)]
public partial class blaListOfListOfTestListOfTest
{
    public object Test { get; set; }
}

反序列化将如下所示:

var serializer = new XmlSerializer(typeof(bla));
var blaObj = serializer.Deserialize(new StringReader(xmlString));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM