使用Nokogiri在XPath中逃脱单引号?

我有一个看起来像这样的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#中发现了另一个关于此问题的问题 ,以及Nokogiri邮件列表中的一个post ,如果你需要进一步研究这两个问题,这两个问题都值得一看。