设想以下 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/