2012-05-07 16 views
13

He visto varias cosas sobre esto, pero nada parece funcionar hasta el momento. Estoy analizando un xml a través de una url usando nokogiri en rieles 3 ruby ​​1.9.2.tratando de obtener contenido dentro de las etiquetas cdata en el archivo xml usando nokogiri

Un fragmento del XML tiene el siguiente aspecto:

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

Estoy tratando de analizar esto para obtener el texto asociado a la 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 

Lo que obtengo a cambio es

<newslinetext></newslinetext> 
NOTHING 
NOTHING 

Así que sé que mis etiquetas se nombran/deletrean correctamente para obtener los datos de newsline, pero el cdata el texto nunca aparece.

¿Qué debo hacer con nokogiri para obtener este texto?

+0

Mire su caso, creo que se nokogiri downcase nombres html pero no xml – pguardiario

+0

@pguardiario: Aaron está utilizando analizador de HTML de Nokogiri, no su analizador XML. –

+0

Estabas todo correcto. Estaba usando involuntariamente el analizador de HTML que me obligó a usar minúsculas. Luego, cuando traté de usar el analizador XML, no obtuve ningún resultado (porque ya estaba usando minúsculas). Después de ver las respuestas aquí, me di cuenta de mi idiotez y cambié a mayúsculas y minúsculas y XML. Funciona perfecto gracias –

Respuesta

11

Está tratando de analizar XML utilizando el analizador HMTL de Nokogiri. Si node como del analizador XML entonces r sería nil dado que XML distingue entre mayúsculas y minúsculas; su r no es nil, por lo que está usando el analizador HTML que no distingue entre mayúsculas y minúsculas.

analizador XML de Uso Nokogiri y obtendrá cosas como esta:

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

y usted será capaz de obtener en el CDATA través r.text o r.children.

+0

Bah ... Estaba usando HTML y traté de ser sensible a mayúsculas y minúsculas y no me daba ningún resultado y no pude entender por qué, así que lo dejé todo en minúsculas, lo que funcionó. Más tarde intenté usar el analizador XML de Nokogiri, pero lo hice ignorando el caso y no devolvió ningún resultado. Supongo que debería haber intentado con XML y con mayúsculas y minúsculas, y habría funcionado con lo que estaba intentando. Voy a verificar esto y dejarte saber los resultados. –

+0

Estabas todo correcto. Estaba usando involuntariamente el analizador de HTML que me obligó a usar minúsculas. Luego, cuando traté de usar el analizador XML, no obtuve ningún resultado (porque ya estaba usando minúsculas). Después de ver las respuestas aquí, me di cuenta de mi idiotez y cambié a mayúsculas y minúsculas y XML. Funciona perfecto gracias –

+0

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

3

Ah, ya veo. Lo que @mu dijo es correcto. Pero para llegar a la CDATA directamente, tal vez:

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