简体   繁体   English

如何使用linq to XML将条件节点添加/插入到XML中

[英]how to add/insert conditional node into XML using linq to XML

I generated an xml file like this: 我生成了一个像这样的xml文件:

 XElement employees =
        new XElement("Work",
           new XElement("record",
              new XElement("Name", textBox1.Text),
              new XElement("Phone", "206-555-0144"),
              new XElement("Address",
                    new XElement("Street1", "123 Main St"),
                    new XElement("City", "Mercer Island"),
                    new XElement("State", "WA"),
                    new XElement("Postal", "68042")
             )),
             new XElement("record",
              new XElement("Name", "22222"),
              new XElement("Phone", "353245345"),
              new XElement("Address",
                    new XElement("Street1", "sdfain St"),
                    new XElement("City", "asdf Island"),
                    new XElement("State", "QLD"),
                    new XElement("Postal", "54322")
              )),
              new XElement("record",
              new XElement("Name", "Peter"),
              new XElement("Phone", "1234"),
              new XElement("Address",
                    new XElement("Street1", "sd St"),
                    new XElement("City", "cbr"),
                    new XElement("State", "act"),
                    new XElement("Postal", "2600")
              )
          )
      );

Later I wish to add new child node under parent node "record" based on a condition (where name="peter"), something like this: 后来我希望根据条件(其中name =“peter”)在父节点“record”下添加新的子节点,如下所示:

empFile.Elements().Where(r => (string)r.Element("Name") == "Peter")
                  .Add(new XElement("record",
                           new XElement("Mobile", "3253425"),
                           new XElement("Work", 999999)
                       ));

How can I achieve this? 我怎样才能做到这一点?

As well as Tim's suggestion of using Where followed by Single or First , it's worth knowing that there are overloads of those methods which already take predicates. 除了Tim建议使用Where后跟SingleFirst ,还值得知道那些已经采用谓词的方法存在重载。 For example: 例如:

empFile.Elements()
       .Single(r => (string) r.Element("Name") == "Peter")
       .Add(...);

You are nearly there, your Where clause returns an IEnumerable<XElement> not a single XElement, so you just need to fix that, ie call .Single() or .First() etc 你几乎就在那里,你的Where子句返回一个IEnumerable<XElement>而不是一个XElement,所以你只需要修复它,即调用.Single()或.First()等

eg: 例如:

XElement xe = empFile.Elements().Where(r => (string)r.Element("Name") == "Peter").Single();

xe.Add(new XElement("record", new XElement("Mobile", "3253425"), new XElement("Work", 999999)); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM