我试图通过XPath评估检查XML文档中的两个规则。
规则是:
我的代码如下:
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以来是有效的运算符......
答案 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(...
可以评估表达式。