c# - 将 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 时,我没有收到任何错误。
你知道原因吗?
谢谢。
解决方案
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 表达式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
永远不会为空的值,因此您可能需要调整您的断言以测试valueDate.Any()
是否为真。
推荐阅读
- sql - Oracle Join Between 以分钟为间隔时间
- cypress - Cypress using JSON fixture in body?
- c - 使用 AVX512 或 SVML 内在函数将压缩的 16 位整数与掩码相除
- java - Android Java 抛出 java.net.SocketException: socket failed: EPERM (Operation not allowed)
- javascript - 数学逻辑,将可缩放的数字转换为百分比
- javascript - 在量角器 POM 实现中出现错误
- python - 将字典转换为 pandas 数据框,删除 2 级项目
- terraform - terraform 将变量值分配给映射字段值或默认值(如果不存在)
- excel - 复制粘贴区域大小不一样?
- docker - Kubernetes 上的火花:预期的 HTTP 101 响应,但“403 Forbidden”