【问题标题】:XML - Select xmlNode depending on innertextXML - 根据内部文本选择 xmlNode
【发布时间】:2015-03-12 09:59:24
【问题描述】:

我有一个“xmlDocument”对象, 其中包含这个结构:

<Projects>
  <Project>
    <Name>Value1</Name>
  </Project>
  <Project>
    <Name>Value2</Name>
  </Project>
</Projects>

我需要在运行时通过 c# 更改这些值。 我的想法是

  • 创建新的“xmlnode”-对象
  • 更改其内部文本
  • 保存文档

但我不知道如何根据其内部文本选择 xml 节点。 我研究了一下,并尝试了:

XmlNode nameNode = doc.SelectSingleNode("Projects\\Project\\Name[text()='" + projectName + "']");

这会导致“XPathException”。

正确的路径怎么写?

【问题讨论】:

  • 所以你想选择一个具有指定内部文本的 标签?
  • 完全正确。例如,我想选择并更改名称标签的内部文本,其中 name=="Value1"

标签: c# xml document


【解决方案1】:

我建议使用 LINQ to XML 而不是 XPath:

XDocument doc = ...; // However you load the XML
XElement element = doc.Root
                      .Elements("Project")
                      .Elements("Name")
                      .Where(x => x.Value == projectName)
                      .SingleOrDefault();
// Check whether or not element is null (if so, you haven't found it)

【讨论】:

  • 谢谢!通过将其更改为“..Elements("Name")..." 这对我有用
  • @Marcel:是的,抱歉,这是我在编辑时所做的更改,因为我认为您需要 Project 元素。
【解决方案2】:

我意识到很久以前有人问过这个问题并找到了替代解决方案,但是我遇到了类似的问题,我设法通过使用 XmlNodeList 使用 xpath 解决了这个问题

XmlNode root = xmlDoc.DocumentElement;

XmlNodeList nodes = root.SelectNodes("//*[local-name()='Projects'//*[local-name()='Project'//*[local-name()='Name'][text()='" + projectName + "']");

然后您可以遍历 XmlNodeList

foreach (XmlNode xn in nodes)....

张贴以防其他人想使用此方法

【讨论】:

    猜你喜欢
    • 2017-08-27
    • 2011-12-14
    • 2020-03-22
    • 2021-01-10
    • 2011-01-21
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多