2012-08-16 72 views
1

我有一个XML文档,看起来像这样:C#XML和LINQ

<people> 
    <person> 
    <name>mike</name> 
    <address>1 main st</address> 
    <jobTitle>SE</jobTitme> 
     <children> 
      <name>mary</name> 
      <age>5</age> 
     </childres> 
    </person> 
    <person> 
    <name>john</name> 
    <address>2 main st</address> 
    <jobTitle>SE</jobTitme> 
    </person> 
</people>` 

所以不是所有的人块和儿童阻塞。很简单。当我通过C#向XML添加新人时,我正在编写一个采用person对象的函数,并且该person对象具有一组children对象(可能为0或更多)。我在编写linq函数时遇到了麻烦。我可以轻松添加一个人物,但有条件地添加1个或更多的孩子很难。这是我到目前为止:

doc.Element("People").Add(
      new XElement("Person", 
       new XElement("Name", person.name), 
       new XElement("Address", person.address), 
       new XElement("jobTitle", person.jobTitle))) 

我如何有条件地添加孩子,如果他们存在?

public class person { public List<Child> childList; public string name; public string address; public string jobTitle }

public class child { public string name; public int age; }

回答

3

我怎么能有条件地添加孩子如果它们存在?

三个选项:

  • 使用在XElement呼叫null参数;那将被忽略
  • 传递一个空的子序列;再次,这将是无关紧要的
  • 构建元素的其余部分,然后有条件地调用Add事后。

如果没有看到Person类型的代码,很难给出更具体的建议。

(顺便说一句,它看起来像你的元素实际上应该是child,而不是孩子,假设你有每个孩子一个元素...)

编辑:现在我们就可以看到你的代码,它看起来像你刚才想:

doc.Element("People").Add(
     new XElement("Person", 
      new XElement("Name", person.name), 
      new XElement("jobTitle", job.title), 
      person.children.Select(c => new XElement("children", 
       new XElement("Name", c.name), 
       new XElement("Age", c.age))))); 

请注意,您目前正在使用您的资本很不一致,当涉及到的元素名称,也这是一个坏主意,露出这样的公共领域。

+0

你能举一个例子吗?所涉及的类和他们所获得的简单,公共字符串成员或儿童和人类。 – mrasmussen 2012-08-16 15:48:47

+0

@ user1048323:您的评论不清楚,但请在您的问题中包括相关课程。特别是,因为“孩子”是复数形式,所以我希望孩子的某种*收藏是人的财产,但是你没有解释什么是可用的。 – 2012-08-16 15:51:19

+0

'public class Person {public List childList;公共字符串名称;公共字符串地址;公共字符串jobTitle; } – mrasmussen 2012-08-16 15:53:34