【问题标题】:Select a XML node based on a sibling node根据兄弟节点选择 XML 节点
【发布时间】:2019-09-27 00:46:43
【问题描述】:

我正在尝试选择一个 XML 节点,其中父节点的另一个子节点包含特定值。

XML 如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<AuthorIT>
    <Objects>
        <Media>don't care</Media>
        <Style>don't care</Style>
        <Book>don't care</Book>
        <Topic>don't care</Topic>
        <Topic>
            <Object>
                <Description>Performance Evidence</Description>
            </Object>
            <Text>This is what I want to select</Text>
        </Topic>
    </Objects>
</AuthorIT>

我在 C# 中使用 XPath。我目前的查询如下所示:(但显然不起作用)

docNav = new XPathDocument(localFile);
nav = docNav.CreateNavigator();
xPath = "//Topic[Object/Description = 'Performance Evidence']/Text";
string value = nav.SelectSingleNode(xPath).Value;

如何从对象/描述值为“性能证据”的主题中获取文本节点的内容?

【问题讨论】:

  • 您的 XPath 是正确的。你能具体说明什么不起作用吗?
  • @KirillPolishchuk nav.SelectSingleNode(xPath) 返回 null。如果我的 XPath 正确,我对 c# 的其余部分做错了吗?
  • 所以...我一直在尝试通过其他方法获取数据。我可以使用 XmlDocument 和 foreach(xmlNodeList 中的 XmlNode 节点)遍历树,但不能通过 xmlDocument.SelectSingleNode(...)。我宁愿没有 5+ 嵌套的 foreach 循环只是为了找到我想要的节点......有什么建议,还是我应该提出一个新问题?
  • 提出了一个新问题。仍然没有解决方案。

标签: c# xml xpath


【解决方案1】:

您应该首先选择包含针状文本的描述节点,然后返回到公共父节点并选择作为其子节点的文本节点。

//Topic/Object/Description[text()='Performance Evidence']/../../Text/text()

【讨论】:

    【解决方案2】:

    正如Kirill Polishchuk 在评论中所说,我的 XPath 是正确的。

    我在示例 XML 中遗漏的是解决方案的关键...命名空间!

    我在另一个问题上找到了答案:Using Xpath With Default Namespace in C#

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多