首页 > 解决方案 > 将 XPathEvaluate 与 If Then Else 一起使用

问题描述

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

你知道原因吗?

谢谢。

标签: c#xpath

解决方案


XPathif表达式是在 XPath 2.0 中引入的,Microsoft 从未将其 XPath 实现更新为比 20 年前的 XPath 1.0 更新的版本。

但是在 .NET 平台上,使用 .NET 2.0,XPath 2.0 的基础架构就在那里,如果您添加第三方 XPath 2 实现,例如https://www.nuget.org/packages/XPath2/https://www.nuget .org/packages/XPath2.Extensions/然后您可以在 .NET API 的扩展方法中使用 XPath 2 表达式XmlNodeXNode并且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永远不会为空的值,因此您可能需要调整您的断言以测试valueDate.Any()是否为真。


推荐阅读