如何在C#中组合两个XPath查询

时间:2018-03-06 08:24:36

标签: c# .net xslt xpath

我试图通过XPath评估检查XML文档中的两个规则。

规则是:

  • /根/ PATH1 /文本()=' TABLE1'
  • /根/ PATH2 /文本()=' TABLE2'

我的代码如下:

XPathDocument document = new XPathDocument(myDocument);
XPathNavigator navigator = document.CreateNavigator();
XmlNamespaceManager xpathNsMgr = new XmlNamespaceManager(navigator.NameTable);    
xpathNsMgr.AddNamespace("xsl", "http://www.w3.org/1999/XSL/Transform");
var result = (bool)navigator.Evaluate("((/root/path1/text()='TABLE1') and (/root/path2/text()='TABLE2'))", xpathNsMgr);

如果我通过自己的评估检查两个XPath,那么一切正常。但如果我按照上面的代码中所示检查它们,我会收到以下错误:

xsltcontext is needed for this query because of an unknown function

为什么不能将两个XPath结合起来并将它们一起评估?我想"和","或"等自XPath 1.0以来是有效的运算符......

2 个答案:

答案 0 :(得分:1)

.NET XPathNavigator仅支持XPath 1.0。

您可以通过将条件转换为谓词(方括号)并查看结果节点集是否为空来轻松地为检查建模。

var result = navigator.Evaluate("/*[path1 = 'TABLE1' and path2 = 'TABLE2']", xpathNsMgr);

此处/*选择文档元素。如果文档元素的实际名称很重要,请写/root

答案 1 :(得分:0)

正如@Tomalak和@Martin Honnen所述,XPath 1.0并不完全支持我的条件。像exists()这样的函数是XPath 2.0的一部分。

由于.NET 4.5(我必须使用)不支持XPath 2.0,我使用以下Nuget包来解决我的问题:http://docs.h2o.ai/h2o/latest-stable/h2o-docs/save-and-load-model.html

只需替换

navigator.Evaluate(...

navigator.XPath2Evaluate(...

可以评估表达式。