我试图在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']