XPathSelectElement报'无效令牌'错误,多值XPath表达式是否合法?
问题解析和解决办法
表达式合法性说明
El[text()=('data2','xxx')] 是XPath 2.0及以上版本的合法语法,用来匹配文本值为data2或xxx的El节点。但.NET Framework 4.7.2自带的XPathSelectElement仅支持XPath 1.0,而XPath 1.0不支持这种多值元组的比较写法,这就是你触发XPathException报错的核心原因。
在线工具验证结果不一致,是因为不同工具默认支持的XPath版本不同:部分工具默认启用XPath 2.0+,所以验证通过;另一部分仅支持XPath 1.0,因此会报解析错误。
无需修改表达式的解决方案
既然你希望保留原表达式格式,推荐使用支持XPath 2.0+的第三方库替代原生XPath解析:
使用Saxon-HE(.NET版本)
Saxon是一款开源XML处理库,支持XPath 2.0/3.0/3.1,能直接解析你的多值表达式:
- 通过NuGet安装
Saxon-HE包 - 示例代码:
using Saxon.Api; // 加载XML文档 Processor processor = new Processor(); DocumentBuilder builder = processor.NewDocumentBuilder(); XdmNode doc = builder.Build(new FileInfo("你的XML文件路径.xml")); // 执行XPath查询 XPathCompiler compiler = processor.NewXPathCompiler(); compiler.DeclareNamespace("", ""); // 根据你的XML实际命名空间调整 XdmValue result = compiler.Evaluate("El[text()=('data2','xxx')]", doc); // 遍历结果节点 foreach (XdmNode node in result) { // 这里编写节点处理逻辑 }
这个方案可以直接使用你现有的外部XPath表达式,不需要修改格式。
补充说明
如果因项目限制无法引入第三方库,那只能将表达式转换为XPath 1.0兼容的El[text()='data2' or text()='xxx']形式,但这是你希望避免的情况,优先级低于第三方库方案。
内容的提问来源于stack exchange,提问作者Andriy Kozachuk
相关产品推荐
相关产品推荐

