我正在尝试在C#中获取xPath表达式的结果。
这是代码:
const string xml = "<ROOT><NODE>VALUE1</NODE></ROOT>";
using (var textReader = new StringReader(xml))
{
var xmlDoc = XDocument.Load(textReader);
var valueDate = xmlDoc.XPathEvaluate(@"if(boolean(//NAMEDNODE)) then //ANYNODE else //NODE ");
Assert.IsNotNull(valueDate);
}
执行此代码时,我得到一个XPathException invalid token
。
但是当我在xPath测试器中测试xPath时,我没有收到错误。
您知道原因吗?
谢谢。
答案 0 :(得分:1)
XPath if
表达式是在XPath 2.0中引入的,Microsoft从未将其XPath实现更新到比20年前的XPath 1.0更高的版本。
在.NET平台的.NET 2.0平台上,存在用于XPath 2.0的基础结构,如果您将第三方https://www.nuget.org/packages/XPath2/与https://www.nuget.org/packages/XPath2.Extensions/一起添加XPath 2实现,则可以在其中使用XPath 2表达式。 .NET API XmlNode
,XNode
和XPathNavigator
的扩展方法。
由于某些原因,我不了解https://github.com/StefH/XPath2.Net/blob/master/src/XPath2/Extensions/XNodeExtensions.cs为XNode提供了各种与XPath2相关的扩展,但不幸的是没有xmlDoc.XPath2Evaluate
方法,因此在这种情况下,您似乎需要使用xmlDoc.CreateNavigator().XPath2Evaluate
进行评估XPath 2表达式一般。
但是,在您xmlDoc.XPath2Select
的情况下,应该使用几种与节点选择相关的方法,例如xmlDoc.XPath2Select("if(boolean(//NAMEDNODE)) then //ANYNODE else //NODE")
。由于该方法返回的IEnumerable
永远不会为null,因此您可能需要调整断言以测试valueDate.Any()
是否为真。