LINQ to XML:如何按值获取所有元素

时间:2013-12-13 14:20:38

标签: c# .net xml linq linq-to-xml

我正在尝试从xml文档中获取具有给定值的所有元素“John”。

LINQ to XML可以实现吗?

我想要实现的是用“Wayne”替换所有“John”值。我知道这可以通过xslt轻松完成,但我需要通过代码来完成。

我的XML:

<Root>
  <Parents>
    <Parent>
      <Name>John</Name>
      <Age>18</Age>
    </Parent>
    <Parent>
      <Name>John</Name>
      <Age>25</Age>
    </Parent>
    <Parent>
      <Name>Peter</Name>
      <Age>31</Age>
    </Parent>
  </Parents>
</Root>

我试过这个:

XmlDocument doc = new XmlDocument();
doc.Load(@"C:/Temp/test.xml");

var elements = doc.Elements().Where(w => w.Value == "John");
foreach (var element in elements)
{
   element.Value = "Wayne";
}

2 个答案:

答案 0 :(得分:4)

您可以使用System.Xml.Linq.XDocument。它更容易使用。

XDocument doc = XDocument.Load(your file path);

var elements = doc.Descendants("Name").Where(i => i.Value == "John");

foreach (var element in elements)
{
    element.Value = "Wayne";
}

doc.Save(your save file path);

这是输出:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Parents>
    <Parent>
      <Name>Wayne</Name>
      <Age>18</Age>
    </Parent>
    <Parent>
      <Name>Wayne</Name>
      <Age>25</Age>
    </Parent>
    <Parent>
      <Name>Peter</Name>
      <Age>31</Age>
    </Parent>
  </Parents>
</Root>

答案 1 :(得分:0)

这是一种方法,它将获得具有值John的所有元素,无论哪个元素(尽管只在同一级别;您必须修改它以查看不同的级别;您可以使用描述的Descendants方法先前):

  XDocument doc = XDocument.Load(@"C:\temp\test.xml");

    var ns = doc.Root.GetDefaultNamespace();
  var elements = doc.Element(ns + "Root").Element(ns + "Parents").Elements(ns + "Parent").Elements().Where(w => w.Value == "John");
  foreach (var element in elements)
  {
    element.Value = "Wayne";
  }

    var stream = new FileStream(@"C:\temp\test.xml", FileMode.Create);

  doc.Save(stream);