我有一个看起来像这样的 XPath 查询,有单引号和双引号。如何正确转义撇号以使查询正常工作?
我试过了:
"//li[text()='Frank's car']"
但它似乎不适合我。
有什么想法吗?
"//li[text()='Frank's car']"
XPath 没有任何转义特殊字符的方法,所以这有点棘手。在这种特定情况下,解决方案是在 XPath 表达式中使用双引号而不是单引号:
text()="Frank's car"
如果你这样做了,如果你在整个表达式周围使用双引号,你将不得不转义 Ruby 的引号:
"//li[text()="Frank's car"]"
如果您不进行任何插值,则可以在此处使用单引号,然后转义单引号:
'//li[text()="Frank's car"]'
更好的选择可能是使用 Ruby 的灵活引用,这样就不需要转义任何引号,例如:
%{//li[text()="Frank's car"]}
请注意,这里的所有示例都在 Ruby 中执行转义,因此到达 XPath 处理器的字符串//li[text()="Frank's car"]
。
更一般的情况是,当文本是可能包含单引号或双引号的变量时,会更加困难。XPath 的字符串文本不能同时包含这两种类型的引号;您需要使用 XPath concat
函数构造字符串。
例如,如果要匹配字符串"That's mine", he said.
,则需要执行以下操作:
text()=concat('"That', "'", 's mine", he said.')
然后你必须转义Ruby的引号(使用%{}
是最简单的(。
我在 C# 中发现了另一个关于 SO 处理此问题的问题,以及 Nokogiri 邮件列表中的一个线程,如果您需要进一步研究,这两个问题都可能值得一看。