【问题标题】:LINQ to XML: How to get all elements by valueLINQ to XML:如何按值获取所有元素
【发布时间】:2013-12-13 14:20:38
【问题描述】:

我正在尝试从 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";
}

【问题讨论】:

  • 仅供参考,这没有做你想要的原因是因为 Elements() 只会包含 Root,其值不是“John”。

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


【解决方案1】:

您可以使用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>

【讨论】:

  • 非常感谢!!这正是我所需要的。
  • 这与问题有点不同,不是吗?他说所有值为 John 的元素,但您只搜索值为 John 的 Name 元素。
  • @emodendroket 是的,但我认为他明白了,并且能够找出解决类似问题的方法
  • 是的,无论元素名称如何,我实际上都会替换所有“John”值,但我只是删除了 Descendants 方法中的参数 :-)
【解决方案2】:

这是一种方法,它将获取所有元素的值为 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多