【问题标题】:trying to get content inside cdata tags in xml file using nokogiri尝试使用 nokogiri 在 xml 文件中的 cdata 标记中获取内容
【发布时间】:2012-05-15 15:33:21
【问题描述】:

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

xml 的 sn-p 如下所示:

<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

所以我知道我的标签被正确命名/拼写以获取新闻行文本数据,但 cdata 文本从未出现。

我需要对 nokogiri 做什么才能获得此文本?

【问题讨论】:

  • 看你的情况,我相信 nokogiri 会小写 html 名称而不是 xml
  • @pguardiario:Aaron 使用的是 Nokogiri 的 HTML 解析器,而不是它的 XML 解析器。
  • 你说的都对。我无意中使用了强制我使用小写字母的 HTML 解析器。然后当我尝试使用 XML 解析器时,我没有得到任何结果(因为我已经使用了小写字母)。看到这里的答案后,我意识到我的白痴并切换到区分大小写和 XML。完美运行。谢谢

标签: ruby ruby-on-rails-3.1 xml-parsing nokogiri cdata


【解决方案1】:

您正在尝试使用 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.textr.children 访问CDATA。

【讨论】:

  • 呸..我使用 HTML 并试图区分大小写,但它没有给我任何结果,我不知道为什么,所以我把它全部放到了小写字母上。后来我尝试使用 Nokogiri 的 XML 解析器,但我忽略了大小写,它没有返回任何结果。我想我应该尝试过 XML 和区分大小写,它会与我正在尝试的东西一起工作。我会检查一下并告诉你结果。
  • 你说的都对。我无意中使用了强制我使用小写字母的 HTML 解析器。然后当我尝试使用 XML 解析器时,我没有得到任何结果(因为我已经使用了小写字母)。看到这里的答案后,我意识到我的白痴并切换到区分大小写和 XML。完美运行。谢谢
  • nokogiri_doc_object.xpath("/root/element").children[0].text
【解决方案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?}

【讨论】:

    猜你喜欢
    • 2013-11-08
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多