C# 嵌套列表C的XML反序列化#
我正在尝试使用XmlSerializer反序列化Xml文件。 我的文件的一部分如下所示:C# 嵌套列表C的XML反序列化#,c#,xml,deserialization,xml-deserialization,C#,Xml,Deserialization,Xml Deserialization,我正在尝试使用XmlSerializer反序列化Xml文件。 我的文件的一部分如下所示: <bla> <ListOfListOfTest> <ListOfTest> <Test> </Test> </ListOfTest> </ListOfListOfTest&g
<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。非常感谢你!哇!那很酷。现在我在问自己,为什么我要花那么多时间手工操作——当我第一次发现它的时候,我也有同样的感觉!