Подтвердить что ты не робот

Пытается получить содержимое внутри тегов 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, чтобы получить этот текст?

4b9b3361

Ответ 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?}