Пытается получить содержимое внутри тегов cdata в xml файле, используя nokogiri
Я видел несколько вещей на этом, но пока ничего не работает. Я разбираю xml через url используя nokogiri на рельсах 3 ruby 1.9.2.
Фрагмент xml выглядит следующим образом:
<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
Итак, я знаю, что мои теги правильно названы/написаны для получения данных newslinetext, но текст cdata никогда не появляется.
Что мне нужно сделать с nokogiri, чтобы получить этот текст?
Ответы
Ответ 1
Вы пытаетесь разобрать XML, используя парсер Nokogiri HMTL. Если node
как из синтаксического анализатора XML, тогда r
будет nil
, поскольку XML чувствителен к регистру; ваш r
не nil
, поэтому вы используете парсер 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"
и вы сможете попасть на CDATA через r.text
или r.children
.
Ответ 2
А я вижу. Что @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?}