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

时间:2013-02-11 22:30:26

标签: ruby xpath nokogiri

我有一个看起来像这样的XPath查询,包含单引号和双引号。如何正确地转义撇号以使查询有效?

我试过了:

"//li[text()='Frank's car']"

但它似乎不适合我。

有什么想法吗?

 "//li[text()='Frank's car']"

1 个答案:

答案 0 :(得分:20)

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 function构建字符串。

例如,如果您想匹配字符串"That's mine", he said.,则需要执行以下操作:

text()=concat('"That', "'", 's mine", he said.')

然后你必须从Ruby中删除引号(使用%{}最容易)。

我找到了another question on SO dealing with this issue in C#thread on the Nokogiri mailing list,如果您需要进一步了解,这两个都值得一看。