c# - 嵌套的 XML 序列化 C#

标签 c# xml

我需要创建带有序列化的嵌套 Xml。我有两个列表,其中的数据必须生成按数字过滤的嵌套 xml。

列表:

List<Person> personList = new List<Person>();
personList.Add(new Person{
Number = 1,
Name = "Dean"
 });

personList.Add(new Person{
  Number = 2,
 Name = "Mike"
 });

 List<Home> homeList= new List<Home>();
  homeList.Add(new Home{
 Number = 2,
 City= "Paris",
 State = "France"
 });

homeList.Add(new Home{
Number = 1,
City= "London",
State = "England"
 });

所以接下来我有用于序列化的类:

public class CreateXML
{
[XElement(ElementName = "Home")]
List<Home> homeList= new List<Home>();
[XElement(ElementName = "Person")]
List<Person> personList = new List<Person>();
}

创建 XML 的方法:

 public void Serialize(CreateXML list)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(CreateXML));
        using (TextWriter writer = new StreamWriter(@"D:\XmlTEST.txt"))
        {
            serializer.Serialize(writer, list);
        }
    }

现在它首先生成 Xml 文件,其中包含所有 Person 数据,然后是 Home 数据。

实际输出:

  <Person>
    <number>1<number>
    <name>Dean</name>
  </Person>
  <Person>
    <number>2<number>
    <name>Mike</name>
  </Person>
  <Home>
    <number>1</number>
    <city>London</city>
    <state>England</state>
  </Home>
  <number>2</number>
  <city>Paris</city>
  <state>London</state>
</Home>

想要的输出:

<Person>
  <number>1<number>
  <name>Dean</name>
  <Home>
    <number>1</number>
    <city>London</city>
    <state>England</state>
  </Home>
</Person>
<Person>
  <number>2<number>
  <name>Mike</name>
  <Home>
    <number>2</number>
    <city>Paris</city>
    <state>France</state>
  </Home>
</Person>

有什么建议吗?

最佳答案

您想将某个HomePerson Dean 相关联:

<Person>
  <number>1</number>
  <name>Dean</name>
  <Home>
    <number>1</number>
    <city>London</city>
    <state>England</state>
  </Home>
</Person>

但是在您的代码中您没有关联这两个实体:

personList.Add(new Person {
    Number = 1,
    Name = "Dean"
});

homeList.Add(new Home{
    Number = 1,
    City= "London",
    State = "England"
});

在上面的示例中,实体是完全不相关的——您需要以某种方式将它们关联起来。

关联这些实体的一种方法是在 Person 类型上定义一个 Home 属性:

public class Person
{
    public string Name { get; set; }
    public int Number { get; set; }
    public Home Home { get; set; }
}

然后放弃 homeList 并将 Home 实例分配给 Person 实例:

List<Person> personList = new List<Person>();
personList.Add(new Person
{
    Number = 1,
    Name = "Dean",
    Home = new Home
    {
        Number = 1,
        City = "London",
        State = "England"
    }
});

输出:

<personList>
  <Person>
    <Name>Dean</Name>
    <Number>1</Number>
    <Home>
      <Number>2</Number>
      <City>Paris</City>
      <State>France</State>
    </Home>
  </Person>
  <Person>
    <Name>Mike</Name>
    <Number>2</Number>
    <Home>
      <Number>1</Number>
      <City>London</City>
      <State>England</State>
    </Home>
  </Person>
</personList>

更新

根据您的评论,您可以动态分配给 Home 属性,如下所示:

foreach (var home in homeList)
{
    foreach (var person in personList)
    {
        if (home.Number == person.Number)
        {
            person.Home = home;
        }
    }
}

请记住,如果没有相应的门牌号,House 属性将保持为 null

关于c# - 嵌套的 XML 序列化 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31675019/

相关文章:

c# - 是否可以在 Linux 中从 Python 调用 C# dll?

通过代码隐藏的 C# 数据绑定(bind)不适用于 TextBox 中的 Text 属性

c# - 在 WinRT 中创建选项卡

xml - 如何使用马提尼在 golang 中动态呈现为 HTML/JSON/XML?

java - RESTeasy/JAXB;如何避免将命名空间添加到 <any> 标记中的元素? (JAXB 中的列表<元素>)

java - XQuery 表达式 - 屏幕抓取 - Saxon/JTidy

c# - DataGridView 复选框列 "select all"性能

c# - 强制加载 WPF 视觉对象的适当方式

android - 能否通过SAX解析器快速获取指定标签的值?

python - 什么是jsl标签