使用Linq to XML向特定子树添加元素

12

我的 XML:

<Bank>
 <Customer id="0">
  <Accounts>
   <Account id="0" />
   <Account id="1" />                      
  </Accounts>
 </Customer>
 <Customer id="1">
  <Accounts>
   <Account id="0" />                    
   </Accounts>
 </Customer>
 <Customer id="2">
  <Accounts>
   <Account id="0" />                    
  </Accounts>
 </Customer>
</Bank>
我想将一个新的账户元素添加到id为2的客户中。我知道如何添加这一行,但我不知道如何指定客户(在哪里写客户的ID?)
我的LINQ to XML代码:
XDocument document = XDocument.Load("database.xml");
document.Element("Bank").Element("Customer").Element("Accounts").Add
     (
         new XElement
             (
                 "Account", new XAttribute("id", "variable")
             )
      );
document.Save("database.xml");

谢谢你的帮助。XML不是我的好朋友 :(

3个回答

23

你已经接近成功了,你的代码将默认将元素添加到第一个 Customer。你需要在客户集合中搜索属性值为2的id属性 -

document.Element("Bank").Elements("Customer")
        .First(c => (int)c.Attribute("id") == 2).Element("Accounts").Add
                 (
                     new XElement
                         (
                             "Account", new XAttribute("id", "variable")
                         )
                  );

这个完美地运作了,非常感谢。现在我知道该怎么做了。 - Safiron
1
谢谢,Rohit。我一直在尝试访问多个子节点,这个解决方案帮了我很大的忙,尤其是在尝试了大部分失败的解决方案之后。 - Mytroy2050

3
我知道如何添加一行,但我不知道如何指定客户(在哪里写客户的ID?)
首先需要找到具有正确ID的“Customer”元素。例如:
var customer = document.Root
                       .Elements("Customer")
                       .Single(x => (int) x.Attribute("id") == id);
customer.Element("Accounts").Add(new XElement("Account",
                                              new XAttribute("id", "variable")));

请注意,如果不存在具有正确ID的一个Customer元素,则此操作将在Single调用上失败。 如果你想创建一个新的客户,你需要做更多的工作 - 但是这可能会在不同的调用中完成。

0
var cust = xDoc.Descendants("Customer")
               .First(c => c.Attribute("id").Value == "2");
cust.Element("Accounts").Add(new XElement("Account", new XAttribute("id","3") ));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接