18

一重引用符と二重引用符の両方を使用した、次のような XPath クエリがあります。クエリが機能するようにアポストロフィを適切にエスケープするにはどうすればよいですか?

私は試した:

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

しかし、それは私にはうまくいかないようです。

何か案は?

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

1 に答える 1

33

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 の文字列リテラルには、両方のタイプの引用符を含めることはできません。XPathconcat関数を使用して文字列を作成する必要があります。

たとえば、 string に一致"That's mine", he said.させたい場合は、次のようにする必要があります。

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

そして、Ruby から引用符をエスケープする必要があります (使用%{}するのが最も簡単です)。

C#でこの問題を扱っている SO に関する別の質問とNokogiri メーリング リストのスレッドを見つけました。

于 2013-02-11T23:29:08.890 に答える