我有一个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中是否有任何方法表示一旦找到匹配就停止?
感谢您的帮助!
答案 0 :(得分:0)
不在单个XPath表达式中。
您可以尝试这一点,并且必须依赖于所使用的优化程序的聪明才智:
Exp1 | Exp2[not(Exp1)] | Exp3[not(Exp1) and not(Exp2)]
如果优化器是一个不错的(在我认为是.NET的情况下),只有当Exp1没有选择节点时才会评估Exp2,只有当Exp1和Exp2都没有评估时才会评估Exp3不选择节点。