1

我有一个 XML 文件,我想将三个不同节点之一解析到我的 C# 程序中。这三种不同的 XPath 中只有一种对任何 XML 文件有效,并且每一种都尽可能具体。下面是一个示例 XPath:

/ns:root/ns:foo/ns:bar[@barattr='{0}']/ns:foobar{1}/ns:{2} |                     
/ns:root/ns:foo/ns:bar[@barattr='{0}']/ns:{2} |                                
/ns:root/ns:foo/ns:bar[@barattr='{0}' and @{2}]

请注意,它们中有格式化程序,因为在代码中我使用 String.Format 动态生成这些查询。

那么,我的问题是,如果第一个 XPath 返回一个节点,SelectSingleNode 会做什么(即存在 ns:root/ns:foo/ns:bar[@barattr='{0}']/ns:foobar{1}/ ns:{2})? 它仍然会查询所有三个 XPath 并只返回第一个,还是会知道在那个时候停止?如果它仍然查询所有三个,C# 或 XPath 中是否有任何方法表示一旦找到匹配项就停止?

谢谢您的帮助!

4

1 回答 1

0

Not in a single XPath expression.

You could try this, and must rely on the cleverness of the Optimizer being used:

Exp1 | Exp2[not(Exp1)] | Exp3[not(Exp1) and not(Exp2)]

If the optimizer is a decent one (which in the case of .NET I believe it is), Exp2 will be evaluated only if Exp1 doesn't select a node, and Exp3 will be evaluated only if neither of Exp1 and Exp2 doesn't select a node.

于 2012-11-21T19:50:43.770 回答