2013-02-11 12 views
9

मेरे पास एक XPath क्वेरी है जो इस तरह दिखती है, दोनों सिंगल और डबल कोट्स के साथ। मैं एस्ट्रोफ़े से ठीक से कैसे बचूं ताकि क्वेरी काम करे?नॉकोगिरी के साथ XPath में एकल उद्धरण से बचें?

मैंने कोशिश की:

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

लेकिन यह मेरे लिए यह करने के लिए प्रतीत नहीं होता।

कोई विचार?

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

उत्तर

18

XPath के पास विशेष पात्रों से बचने का कोई तरीका नहीं है, इसलिए यह थोड़ा मुश्किल है।

text()="Frank's car" 

आप इस किया था, तो आप रूबी से बोलियां से बचने के लिए अगर आप को दोहरे उद्धरण चिह्नों का इस्तेमाल किया होगा: इस विशिष्ट मामले में एक समाधान XPath अभिव्यक्ति में सिंगल कोट्स के बजाय डबल कोट्स उपयोग करने के लिए किया जाएगा पूरे अभिव्यक्ति:

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

आप एकल उद्धरण यहाँ इस्तेमाल कर सकते हैं अगर आप किसी भी प्रक्षेप कर नहीं कर रहे हैं, और उसके बाद एकल उद्धरण से बच:

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

एक बेहतर विकल्प होगा पी erhaps के हवाले से रूबी के लचीला का उपयोग करना है, ताकि उद्धरण में से कोई भी, बचने की आवश्यकता होगी हो जैसे:

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

ध्यान दें कि सभी उदाहरण यहाँ रूबी में बचने कर रही है, ताकि स्ट्रिंग कि XPath तक पहुँच जाता है प्रोसेसर //li[text()="Frank's car"] है।

अधिक सामान्य मामला, जब टेक्स्ट परिवर्तनीय होता है जिसमें सिंगल या डबल कोट्स हो सकते हैं तो अधिक कठिन होता है। XPath के स्ट्रिंग अक्षर में दोनों प्रकार के उद्धरण शामिल नहीं हो सकते हैं; आपको XPath concat function का उपयोग कर स्ट्रिंग बनाने की आवश्यकता है।

उदाहरण के लिए, यदि आप स्ट्रिंग "That's mine", he said. मिलान करने के लिए चाहता था, आप की तरह कुछ करने के लिए की आवश्यकता होगी:

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

और फिर आप रूबी से बोलियां से बचने के लिए (%{} का उपयोग कर सबसे आसान हो जाएगा) होगा ।

मुझे another question on SO dealing with this issue in C# और thread on the Nokogiri mailing list मिला, जिनमें से दोनों को यह देखने के लायक हो सकता है कि आपको इसे आगे ले जाने की आवश्यकता है या नहीं।

+0

उत्कृष्ट रूप से समझाया गया। बहुत बढ़िया। – Phrogz

संबंधित मुद्दे