XPathSelectElement 因"has an invalid token"而崩溃



我试图在XPath条件中使用可能值的列表来查找XML中的节点,但是XPathSelectElement抛出system . XML .XPath. xpathexcexception 'an invalid token'。

下面是。net Framework 4.7.2中的一个示例代码。

首先查找单个值'data2',它工作,然后查找'data2'或'xxx',它失败了。

using System;
using System.Xml.Linq;
using System.Xml.XPath;

public class Program
{
public static void Main()
{
XDocument doc = new XDocument(     
new XElement("Root",  
new XElement("El", "data1"),  
new XElement("El", "data2")
)  
);  
Console.WriteLine(doc.ToString());

var found = doc.Root.XPathSelectElement("El[text()=('data2')]");

Console.WriteLine("rnFound element:");
Console.WriteLine(found.ToString());

var found2 = doc.Root.XPathSelectElement("El[text()=('data2','xxx')]");
Console.WriteLine("rnFound element2:");
Console.WriteLine(found2.ToString());
}
}

输出:

<Root>
<El>data1</El>
<El>data2</El>
</Root>
Found element:
<El>data2</El>
Run-time exception (line 23): 'El[text()=('data2','xxx')]' has an invalid token.

我尝试了2个具有相同XPath表达式/*/El[text()=('data2','xxx')]的绝对版本的在线XPath验证器。它可以在https://www.freeformatter.com/xpath-tester.html上工作,但是失败了,提示"XPath解析错误"。在https://www.atatus.com/tools/xpath-validator .

El[text()=('data2','xxx')]是一个有效的XPath表达式吗?

我知道可以用El[text()='data2' or text()='xxx']替换表达式,但是我从外部接收XPath,并且希望尽可能避免转换它。

问题是您的更复杂的表达式使用XPath 2.0,运算符来构造序列,这是XPath 2.0和更高版本的数据结构,但不是XPath 1.0。

/*/El[text()=('data2','xxx')]

在XPath 2.0中,表达式('data2')定义了一个字符串,也就是一个字符串的序列,表达式('data2', 'xxx')定义了两个字符串的序列

在XPath 1.0中,表达式('data2')定义了一个字符串,表达式('data2', 'xxx')无效。

您可能需要将XPath处理器升级到版本2或更高版本,或者您可能需要为XPath 1处理器使用不同的XPath表达式,例如

/*/El[text()='data2' or text()='xxx']

相关内容

  • 没有找到相关文章

最新更新