为啥我在使用带有 c# XPathNavigator Evaluate 的 Xpath if-then-else Expression 时得到一个无效的令牌?

Posted

技术标签:

【中文标题】为啥我在使用带有 c# XPathNavigator Evaluate 的 Xpath if-then-else Expression 时得到一个无效的令牌?【英文标题】:why I get an invalid token while using Xpath if-then-else Expression with c# XPathNavigator Evaluate?为什么我在使用带有 c# XPathNavigator Evaluate 的 Xpath if-then-else Expression 时得到一个无效的令牌? 【发布时间】:2020-12-08 11:46:54 【问题描述】:

尝试通过 XpathNavigor 评估以下表达式时,我得到一个无效的令牌异常:

var expression = if(//DovizCins = 'YTL') then '1' else '2';

var nav = doc.CreateNavigator();
XPathExpression xp = XPathExpression.Compile(expression);
var value = nav.Evaluate(xp);

return value?.ToString() ?? string.Empty;

例外是:

System.Xml.XPath.XPathException: ''if(//DovizCins = 'YTL') then '1' else '2'' has an invalid token.'

【问题讨论】:

我认为表达式缺少一个 =,它应该是 DovinzCins == "" 【参考方案1】:

我完全同意迈克尔·凯的观点。

MS官方文档有误:https://docs.microsoft.com/en-us/dotnet/api/system.xml.xpath?view=netframework-4.7.1

摘录

"...System.Xml.XPath 命名空间包含定义用于导航和编辑 XML 信息项的游标模型的类,作为 XQuery 1.0 和 XPath 2.0 数据模型的实例..."

XQuery 1.0 和 XPath 2.0 由 MS SQL Server 部分支持。 .Net 框架不支持任何 XQuery,其 XPath 为 1.0

【讨论】:

【参考方案2】:

Microsoft 的 XML 技术已经过时了。这是 2007 年推出的 XPath 2.0 语法,微软尚未赶上:他们仍在发布 XPath 1.0。

【讨论】:

但是这里说有处理xpath 2.0的类和方法docs.microsoft.com/en-us/dotnet/api/… 它谈到支持 XPath 2.0 数据模型,但不支持 XPath 2.0 语言。 (他们要么是不诚实,要么他们在完成 2.0 的过程中完成了一半,然后就停止了)。另见***.com/questions/46805830/…

以上是关于为啥我在使用带有 c# XPathNavigator Evaluate 的 Xpath if-then-else Expression 时得到一个无效的令牌?的主要内容,如果未能解决你的问题,请参考以下文章

为啥c#可以在android和iOS上制作带有GUI的程序而c++不能? [关闭]

为啥我在尝试从 C# 处理程序发布 GraphQL 查询时收到错误请求?

我在 linux 上使用带有 C# 的 .net 核心,缺少 lib System.Drawing

为啥我在 C# 中收到“无法读取属性 HRESULT:0x80650002”?

为啥我在 IDisposable 类中获得带有私有成员 IDisposable 的 CA2000?

带有 IKVM 的 C# 中 Weka 的 LIbSVM