简体   繁体   中英

LINQ to XML: How to get all elements by value

I'm trying to get all elements with a given value, "John", from an xml document.

Is this possible with LINQ to XML?

What I want to achieve is to replace all "John" values with "Wayne". I know this can easily be done with xslt, but I need to do this by code.

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

I have tried this:

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";
}

You may use System.Xml.Linq.XDocument . It's more easy to work with.

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

Here is the output:

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

Here is an approach that will get all elements with the value John, regardless of what element (although only at the same level; you'd have to modify it to look at different levels too; you could use the Descendants approach described previously):

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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