2013-02-11 12 views
9

Ich habe eine XPath-Abfrage, die so aussieht, mit einfachen und doppelten Anführungszeichen. Wie kann ich den Apostroph richtig umgehen, damit die Abfrage funktioniert?Escape einzelnes Zitat in XPath mit Nokogiri?

Ich habe versucht:

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

aber es scheint nicht, es für mich zu tun.

Irgendwelche Ideen?

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

Antwort

18

XPath hat keine Möglichkeit, Sonderzeichen zu entkommen, so ist dies ein wenig schwierig. Eine Lösung in diesem speziellen Fall wäre doppelte Anführungszeichen statt einfache Anführungszeichen in der XPath-Ausdruck zu verwenden:

text()="Frank's car" 

Wenn du das getan hast, dann würden Sie die Zitate von Ruby entkommen müssen, wenn Sie doppelte Anführungszeichen um die verwendete ganzer Ausdruck:

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

Sie einfache Anführungszeichen hier verwenden kann, wenn Sie keine Interpolation tun, und dann das Apostroph zu entkommen:

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

Eine bessere Option wäre p erhaps zu zitieren flexiblen Einsatz von Ruby zu machen, so dass keiner der Anführungszeichen zu entkommen müßte, zum Beispiel:

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

Beachten Sie, dass alle hier Beispiele Flucht in Ruby zu tun, so dass die Zeichenfolge, die die XPath erreicht Prozessor ist //li[text()="Frank's car"].

Der allgemeinere Fall, wenn die Textvariable ist, die einfache oder doppelte Anführungszeichen enthalten könnte, ist schwieriger. Die Zeichenfolgenliterale von XPath können nicht beide Anführungszeichen enthalten. Sie müssen die Zeichenfolge mit der XPath concat function konstruieren.

Zum Beispiel, wenn Sie die Zeichenfolge "That's mine", he said. passen wollten, würden Sie so etwas wie tun müssen:

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

Und dann würden Sie die Zitate von Ruby entkommen müssen (%{} Verwendung wäre am einfachsten) .

Ich fand another question on SO dealing with this issue in C#, und eine thread on the Nokogiri mailing list, die beide einen Blick wert sind, wenn Sie dies weiter gehen müssen.

+0

Ausgezeichnet erklärt. Gut gemacht. – Phrogz