2012-05-07 7 views
13

का उपयोग कर xml फ़ाइल में cdata टैग के अंदर सामग्री प्राप्त करने का प्रयास कर रहा है मैंने इस पर कई चीजें देखी हैं, लेकिन अब तक कुछ भी काम नहीं कर रहा है। मैं रेलवे 3 ruby ​​1.9.2 पर nokogiri का उपयोग कर एक यूआरएल के माध्यम से एक एक्सएमएल पार्स कर रहा हूँ।nokogiri

<NewsLineText> 
    <![CDATA[ 
    Anna Kendrick is ''obsessed'' with 'Game of Thrones' and loves to cook, particularly  creme brulee. 
    ]]> 
</NewsLineText> 

मैं NewsLineText के साथ जुड़े पाठ प्राप्त करने के लिए इस बाहर पार्स करने का प्रयास कर रहा हूँ

r = node.at_xpath('.//newslinetext') if node.at_xpath('.//newslinetext') 
s = node.at_xpath('.//newslinetext').text if node.at_xpath('.//newslinetext') 
t = node.at_xpath('.//newslinetext').content if node.at_xpath('.//newslinetext') 
puts r 
puts s ? if s.blank? 'NOTHING' : s 
puts t ? if t.blank? 'NOTHING' : t 

क्या मैं बदले में मिलता है

है:

एक्सएमएल का एक स्निपेट इस तरह दिखता है

<newslinetext></newslinetext> 
NOTHING 
NOTHING 

तो मुझे पता है कि न्यूज़लाइनेट डेटा पर जाने के लिए मेरे टैग का नाम सही ढंग से नामित/वर्तनी है, लेकिन सीडीटा पाठ कभी नहीं दिखाता है।

इस पाठ को पाने के लिए मुझे नोकोगिरी के साथ क्या करने की ज़रूरत है?

+0

अपने मामले देखते हैं, मेरा मानना ​​है कि nokogiri एचटीएमएल नाम downcase जाएगा, लेकिन नहीं एक्सएमएल – pguardiario

+0

@pguardiario: हारून Nokogiri के HTML पार्सर, न कि उसकी XML पार्सर उपयोग कर रहा है। –

+0

आप सभी सही थे। मैं अनजाने में HTML पार्सर का उपयोग कर रहा था जिसने मुझे लोअरकेस का उपयोग करने के लिए मजबूर किया। फिर जब मैंने एक्सएमएल पार्सर का उपयोग करने की कोशिश की, तो मुझे कोई परिणाम नहीं मिला (क्योंकि मैं पहले से ही लोअरकेस का उपयोग कर रहा था)। यहां जवाब देखने के बाद, मैंने अपनी मूर्खता महसूस की और केस संवेदनशीलता और एक्सएमएल पर स्विच किया। सही काम करता है। धन्यवाद –

उत्तर

11

आप नोकोगिरी के एचएमटीएल पार्सर का उपयोग करके एक्सएमएल का विश्लेषण करने की कोशिश कर रहे हैं। यदि node एक्सएमएल पार्सर के रूप में rnil होगा क्योंकि एक्सएमएल केस संवेदनशील है; आपका rnil नहीं है, इसलिए आप HTML पार्सर का उपयोग कर रहे हैं जो केस असंवेदनशील है।

उपयोग Nokogiri के XML पार्सर और आप इस तरह की बातें हो जाएगा:

>> r = doc.at_xpath('.//NewsLineText') 
=> #<Nokogiri::XML::Element:0x8066ad34 name="NewsLineText" children=[#<Nokogiri::XML::Text:0x8066aac8 "\n ">, #<Nokogiri::XML::CDATA:0x8066a9c4 "\n Anna Kendrick is ''obsessed'' with 'Game of Thrones' and loves to cook, particularly  creme brulee.\n ">, #<Nokogiri::XML::Text:0x8066a8d4 "\n">]> 
>> r.text 
=> "\n \n Anna Kendrick is ''obsessed'' with 'Game of Thrones' and loves to cook, particularly  creme brulee.\n \n" 

और आप r.text या r.children के माध्यम से CDATA पर प्राप्त करने में सक्षम हो जाएगा।

+0

बह .. मैं एचटीएमएल का उपयोग कर रहा था और केस संवेदनशील होने की कोशिश की और यह मुझे कोई परिणाम नहीं दे रहा था और मुझे पता नहीं लगा कि क्यों मैंने इसे सब लोअरकेस पर छोड़ दिया जो काम करता था। बाद में मैंने नोकोगिरी के एक्सएमएल पार्सर का उपयोग करने की कोशिश की, लेकिन मैंने इसे अनदेखा कर दिया और इसे कोई परिणाम नहीं मिला। मुझे लगता है कि मुझे एक्सएमएल और केस-सेंसिटिव की कोशिश करनी चाहिए थी और यह जो भी मैं कोशिश कर रहा था उसके साथ काम करता। मैं इसे देख लूंगा और आपको परिणाम बता दूंगा। –

+0

आप सभी सही थे। मैं अनजाने में HTML पार्सर का उपयोग कर रहा था जिसने मुझे लोअरकेस का उपयोग करने के लिए मजबूर किया। फिर जब मैंने एक्सएमएल पार्सर का उपयोग करने की कोशिश की, तो मुझे कोई परिणाम नहीं मिला (क्योंकि मैं पहले से ही लोअरकेस का उपयोग कर रहा था)। यहां जवाब देखने के बाद, मैंने अपनी मूर्खता महसूस की और केस संवेदनशीलता और एक्सएमएल पर स्विच किया। सही काम करता है। धन्यवाद –

+0

nokogiri_doc_object.xpath ("/ root/element")। बच्चे [0] .text – Alex

3

आह मैं देखता हूं। क्या @mu ने कहा सही है। लेकिन, सीधे cdata पर प्राप्त करने के लिए हो सकता है:

xml =<<EOF 
<NewsLineText> 
    <![CDATA[ 
    Anna Kendrick is ''obsessed'' with 'Game of Thrones' and loves to cook, particularly  creme brulee. 
    ]]> 
</NewsLineText> 
EOF 
node = Nokogiri::XML xml 
cdata = node.search('NewsLineText').children.find{|e| e.cdata?} 
संबंधित मुद्दे