限制多个XPath上SelectSingleNode的查询时间

时间:2012-11-21 15:37:42

标签: c# xml performance xpath

我有一个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来动态生成这些查询。

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

不在单个XPath表达式中。

您可以尝试这一点,并且必须依赖于所使用的优化程序的聪明才智:

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

如果优化器是一个不错的(在我认为是.NET的情况下),只有当Exp1没有选择节点时才会评估Exp2,只有当Exp1和Exp2都没有评估时才会评估Exp3不选择节点。