2012-05-07 14 views
13

Bu konuda birkaç şey gördüm, ama hiçbir şey şimdiye kadar işe yaramadı. Ben raylar 3 ruby ​​1.9.2 nokogiri kullanarak bir url üzerinden bir xml ayrıştırma. Ben NewsLineText ile ilişkili metni almak için bunu ayrıştırmak çalışıyorumnokogiri'yi kullanarak xml dosyasında cdata etiketlerini içeri almaya çalışırken

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

Ne Karşılığında olsun
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 

:

xml bir pasajı şöyle

<newslinetext></newslinetext> 
NOTHING 
NOTHING 

Bu yüzden etiketlerimin newslinetext verilerine ulaşmak için doğru şekilde adlandırıldığını/yazıldığını biliyorum, ancak cdata metin asla gösterilmez.

Bu metni almak için nokogiri ile ne yapmam gerekir?

+0

davanızı izlemek, ben Nokogiri html adlarını downcase ancak inanmadığını xml – pguardiario

+0

@pguardiario: Aaron Nokogiri HTML ayrıştırıcı değil, kendi XML ayrıştırıcı kullanıyor. –

+0

Hepiniz haklısınız. İstemeden küçük harf kullanmaya zorlayan HTML ayrıştırıcısını istemeden kullandım. Sonra XML ayrıştırıcısını kullanmaya çalıştığımda hiçbir sonuç almamıştım (çünkü zaten küçük harf kullanıyordum). Buradaki cevapları gördükten sonra, gerginliğimi fark ettim ve vaka duyarlılığına ve XML'e geçtim. Mükemmel çalışır. teşekkürler –

cevap

11

Nokogiri'nin HMTL çözümleyicisini kullanarak XML'yi ayrıştırmaya çalışıyorsunuz. XML ayrıştırıcısından itibaren node ise, r, XML büyük/küçük harfe duyarlı olduğu için nil olur; r, nil değil, dolayısıyla büyük/küçük harf duyarlı olmayan HTML ayrıştırıcısını kullanıyorsunuz.

>> 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" 

ve r.text veya r.children yoluyla CDATA'da almak mümkün olacak:

Kullanım Nokogiri XML ayrıştırıcı ve bu gibi şeyler alacak.

+0

Bah .. HTML kullanıyordum ve büyük/küçük harfe duyarlı olmaya çalıştım ve bana hiç bir sonuç vermiyordu ve neden işe yaramadığımı anlayamadım. Daha sonra Nokogiri'nin XML ayrıştırıcısını kullanmayı denedim, ancak bunu görmezden geldim ve sonuç vermedi. Sanırım XML'i ve büyük/küçük harfe duyarlı çalışmalıydım ve denediğim şeyle çalışmalıydım. Bunu kontrol edip sonuçları size bildiririm. –

+0

Hepiniz haklısınız. İstemeden küçük harf kullanmaya zorlayan HTML ayrıştırıcısını istemeden kullandım. Sonra XML ayrıştırıcısını kullanmaya çalıştığımda hiçbir sonuç almamıştım (çünkü zaten küçük harf kullanıyordum). Buradaki cevapları gördükten sonra, gerginliğimi fark ettim ve vaka duyarlılığına ve XML'e geçtim. Mükemmel çalışır. teşekkürler –

+0

nokogiri_doc_object.xpath ("/ root/element") Çocuklar [0] .text – Alex

3

Ah görüyorum. Ne @mu dedi doğrudur. Ama belki doğrudan cdata ulaşmak için:

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?} 
İlgili konular