2012-05-07 9 views
13

Ho visto diverse cose su questo, ma non è sembrato che funzioni fino ad ora. Sto analizzando un xml tramite un url usando nokogiri su rails 3 ruby ​​1.9.2.cercando di ottenere contenuti all'interno di tag cdata nel file xml utilizzando nokogiri

un frammento del xml assomiglia a questo:

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

Sto cercando di analizzare questo fuori per ottenere il testo associato alla 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 

Quello che ricevo in cambio è

<newslinetext></newslinetext> 
NOTHING 
NOTHING 

Quindi so che i miei tag sono denominati/digitati correttamente per ottenere nei dati newslinetext, ma il cdata il testo non compare mai.

Cosa devo fare con nokogiri per ottenere questo testo?

+0

guardare il vostro caso, credo nokogiri sarà downcase nomi html ma non xml – pguardiario

+0

@pguardiario: Aaron sta usando parser HTML di Nokogiri, non il suo parser XML. –

+0

Eri tutto corretto. Ho usato involontariamente il parser HTML che mi ha costretto a usare lettere minuscole. Poi, quando ho provato a utilizzare il parser XML, non ho ottenuto risultati (perché stavo già usando lettere minuscole). Dopo aver visto le risposte qui, ho realizzato la mia idiozia e sono passata alla case sensitive e all'XML. Funziona perfettamente. grazie –

risposta

11

Stai cercando di analizzare XML usando il parser HMTL di Nokogiri. Se node come dal parser XML, allora r sarebbe nil dato che l'XML fa distinzione tra maiuscole e minuscole; il tuo r non è nil quindi stai utilizzando il parser HTML che non fa distinzione tra maiuscole e minuscole.

parser XML Usa Nokogiri e si otterrà cose come questa:

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

e sarete in grado di ottenere al CDATA attraverso r.text o r.children.

+0

Bah .. Stavo usando HTML e ho cercato di fare distinzione tra maiuscole e minuscole e non mi stava dando alcun risultato e non riuscivo a capire perché, così ho lasciato tutto in minuscolo che funzionava. Più tardi ho provato a utilizzare il parser XML di Nokogiri, ma l'ho fatto ignorando il caso e non ha restituito risultati. Suppongo che avrei dovuto provare XML e case-sensitive e avrebbe funzionato con quello che stavo provando. Lo controllerò e ti farò sapere i risultati. –

+0

Eri tutto corretto. Ho usato involontariamente il parser HTML che mi ha costretto a usare lettere minuscole. Poi, quando ho provato a utilizzare il parser XML, non ho ottenuto risultati (perché stavo già usando lettere minuscole). Dopo aver visto le risposte qui, ho realizzato la mia idiozia e sono passata alla case sensitive e all'XML. Funziona perfettamente. grazie –

+0

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

3

Ah capisco. Ciò che @mu ha detto è corretto. Ma per arrivare al cdata direttamente, forse:

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?}