Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌套列表C的XML反序列化#_C#_Xml_Deserialization_Xml Deserialization - Fatal编程技术网

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

C# 嵌套列表C的XML反序列化#,c#,xml,deserialization,xml-deserialization,C#,Xml,Deserialization,Xml Deserialization,我正在尝试使用XmlSerializer反序列化Xml文件。 我的文件的一部分如下所示: <bla> <ListOfListOfTest> <ListOfTest> <Test> </Test> </ListOfTest> </ListOfListOfTest&g

我正在尝试使用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; }            
    }
公共类bla
{
公共bla()
{
ListOfListOfTest=新列表();
}
[...]
公共列表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 ; } }
    }
公共类bla
{
公共bla()
{
ListOfListOfTest=新列表();
}
[..]
公共列表ListOfListOfTest{get;set;}
[XmlArrayItemAttribute]
公共列表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; }
    }
公共类bla
{
公共bla()
{
ListOfListOfTest=新列表();
}
[...]
公共列表ListOfListOfTest{get;set;}
}
公开课Foo
{
公共食物(
{
ListOfTest=新列表();
}
公共列表ListOfTest{get;set;}
}
->失败了

失败意味着
XmlSerializer
serializer.Deserialize()期间未填充
列表。
我总是得到一个包含零元素的
列表

我做错了什么

谢谢你的努力

像这样的事情

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 { }
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
使用System.Xml.Serialization;
班级计划{
静态void Main(){
var xml=@”
";
var bar=(bar)新的XmlSerializer(typeof(bar))。反序列化(新的StringReader(xml));
Console.WriteLine(bar.Lists.Sum(=>u.Items.Count));//1
}
}
[XmlRoot(“bla”)]
公共类酒吧{
[XmlArray(“ListOfListOfTest”)]
[XmlArrayItem(“列表测试”)]
公共列表列表{get;}=new List();
}
公开课Foo{
[XmlElement(“测试”)]
公共列表项{get;}=new List();
}
公共类测试{}

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

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

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


在C#中创建一个类。单击顶部的“编辑”,然后单击“粘贴特殊”,然后单击“将XML粘贴为类”,此时光标位于类内。VisualStudio将为您正确地反序列化XML并创建必要的类。使用此选项可以比较您认为需要的内容和实际需要的内容,以便自己明确反序列化应该如何工作。

Visual Studio有一个方便的选项-您只需复制粘贴xml,然后转到“编辑>粘贴特殊内容>将xml粘贴为类”菜单。VisualStudio将生成可用于序列化/反序列化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));

您应该熟悉
XmlElement
XmlArray
XmlArrayItem
属性。XmlSerializer显然需要一些元信息来理解什么属于何处。哪些元素可能会重复?都是吗?只是
Test
?XmlArray和XmlArrayItem是缺少的LIK。非常感谢你!哇!那很酷。现在我在问自己,为什么我要花那么多时间手工操作——当我第一次发现它的时候,我也有同样的感觉!