c# - 使用 C# XmlDocument 选择相对 XPath 节点

标签 c# xpath xmldocument

设想以下 XML 文档:

<root>
    <person_data>
        <person>
            <name>John</name>
            <age>35</age>
        </person>
        <person>
            <name>Jim</name>
            <age>50</age>
        </person>
    </person_data>
    <locations>
        <location>
            <name>John</name>
            <country>USA</country>
        </location>
        <location>
            <name>Jim</name>
            <country>Japan</country>
        </location>
    </locations>
</root>

然后我为 Jim 选择人员节点:

XmlNode personNode = doc.SelectSingleNode("//person[name = 'Jim']");

现在我想通过单个 XPath 选择从这个节点检索 Jim 的位置节点。像这样的东西:

XmlNode locationNode = personNode.SelectSingleNode("//location[name = {reference to personNode}/name]");

因为我是基于 personNode 进行选择,所以如果我可以在选择中引用它会很方便。这可能吗?..有联系吗?

当然,我可以添加几行额外的代码并将名称放入变量中,然后在 XPath 字符串中使用它,但这不是我要的。

最佳答案

这不是很有效,但应该可以。文件越大,速度就越慢。

string xpath = "//location[name = //person[name='Jim']/name]";
XmlNode locationNode = doc.SelectSingleNode(xpath);

这是低效的原因:

  • //”简写导致对所有节点进行全文档扫描。
  • []”谓词循环运行,每个<person> 一次。与“//person”匹配。
  • 第二个“//”再次导致全文档扫描,这次每个<person>一次。 .

这意味着您将获得二次 O(n²) 的最坏情况性能,这很糟糕。如果有 n <person> s 和 n <location> s 在您的文档中,n x n 文档范围扫描发生。全部来自一个看起来无辜的 XPath 表达式。

我不建议采用这种方法。两步选择(首先,找到人,然后是位置)会表现得更好。

关于c# - 使用 C# XmlDocument 选择相对 XPath 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/955979/

相关文章:

xml - 错误!关于我使用的所选 XPath 有什么建议吗?

c# - 使用已知的 XSD 从 XML 中读取类型化对象

c# - 创建和处理 XmlNodeList

c# - 尝试从 int 映射时出现无效的转换异常?枚举?

c# - 如何声明要由泛型类型使用的枚举?

c# - 编写一个不是容器的泛型类? [C#]

c# - XmlDocument.SelectNodes 问题

c# - 如何让用户在 asp.net mvc 2 中异步下载多个文件?

python - 在scrapy中,我使用XPATH来选择HTML并得到许多不必要的 ""和,?

html - XPath到标签附近的输入元素?