将XPathEvaluate与If Then Else一起使用

时间:2019-09-23 10:33:58

标签: c# xpath

我正在尝试在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时,我没有收到错误。

您知道原因吗?

谢谢。

1 个答案:

答案 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 XmlNodeXNodeXPathNavigator的扩展方法。

由于某些原因,我不了解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()是否为真。