15

我已经看到了几件事,但到目前为止似乎没有任何效果。我正在使用 rails 3 ruby​​ 1.9.2 上的 nokogiri 通过 url 解析 xml。

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 做什么才能获得此文本?

4

2 回答 2

13

您正在尝试使用 Nokogiri 的 HMTL 解析器解析 XML。如果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"

并且您将能够通过r.text或获取 CDATA r.children

于 2012-05-07T05:44:12.423 回答
4

啊,我明白了。@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?}
于 2012-05-07T09:27:45.797 回答