2015-07-28 81 views
3

我需要使用序列化来创建嵌套的Xml。我有两个列表中的数据必须生成由Number过滤的嵌套xml。嵌套的XML序列化C#

名单:

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> 
    <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> 

有什么建议?

+0

期望输出和实际输出之间有什么区别? – CodeCaster

+0

如果你想要在输出xml结构的Person内部有一个元素Home,你需要添加一个类型为Home的字段给Person类。或者与你卡住的东西? – Fragment

回答

3

你想一定HomePerson院长相关联:

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

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

在上面的示例实体是: 

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

然而,在你的代码中没有这两个实体联系起来完全不相关 - 你需要以某种方式将它们联系起来。你可以涉及这些entites的

一种方式是通过在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

+0

是的,这是我想要做的,但想过滤结果,而不是硬编码。示例Home = new Home {if(Home.Number == Person.Number}然后列出所有数据。 – McKeymayker

+0

@PetarS更新了我的答案。那是你在找什么? –

+0

这就是我所寻找的,我试图整天做同样的事情,但仍然有问题放在foreach语句的位置。 – McKeymayker