0

我的 xml 看起来像这样:

<entry>
  <updated>2012-11-14T13:58:49-07:00</updated>
  <id im:id="557137623" im:bundleId="com.rovio.angrybirdsstarwars">Some text</id>
  <title>Angry Birds Star Wars - Rovio Entertainment Ltd</title>
</entry>
<entry>
  <updated>2012-11-14T13:58:49-07:00</updated>
  <id im:id="557137623" im:bundleId="com.rovio.angrybirdsstarwars">Some text</id>
  <title>Angry Birds Star Wars - Rovio Entertainment Ltd</title>
</entry>

我想使用 Nokogiri 从 xml 中获取一些数据。即我对上面的 xml中的im:id,im:bundleId​​ 和感兴趣。<title>

我已经设法达到了这个工作的阶段:

xml.css("entry id").each do |entry|
   puts entry["im:id"]
   puts entry["im:bundleid"]
end

问题是要获得title内容,我必须xml.css("entry title")单独迭代。是否有遍历条目然后在同一个循环中提取id数据和数据的方法?title

4

1 回答 1

6

首先,您的示例 XML 未正确嵌套,因此需要修复:

<root>
  <entry>
    <updated>2012-11-14T13:58:49-07:00</updated>
    <id im:id="557137623" im:bundleId="com.rovio.angrybirdsstarwars">Some text</id>
    <title>Angry Birds Star Wars - Rovio Entertainment Ltd</title>
  </entry>
  <entry>
    <updated>2012-11-14T13:58:49-07:00</updated>
    <id im:id="557137623" im:bundleId="com.rovio.angrybirdsstarwars">Some text</id>
    <title>Angry Birds Star Wars - Rovio Entertainment Ltd</title>
  </entry>
</root>

然后,这有效:

require 'nokogiri'
require 'pp'

doc = Nokogiri::XML(<<EOT)
<root>
  <entry>
    <updated>2012-11-14T13:58:49-07:00</updated>
    <id im:id="557137623" im:bundleId="com.rovio.angrybirdsstarwars">Some text</id>
    <title>Angry Birds Star Wars - Rovio Entertainment Ltd</title>
  </entry>
  <entry>
    <updated>2012-11-14T13:58:49-07:00</updated>
    <id im:id="557137623" im:bundleId="com.rovio.angrybirdsstarwars">Some text</id>
    <title>Angry Birds Star Wars - Rovio Entertainment Ltd</title>
  </entry>
</root>
EOT

pp doc.search('entry').map{ |e|
  id = e.at('id')
  [
    id['id'],
    id['bundleId'],
    e.at('title').text
  ]
}

看起来像:

[["557137623",
  "com.rovio.angrybirdsstarwars",
  "Angry Birds Star Wars - Rovio Entertainment Ltd"],
["557137623",
  "com.rovio.angrybirdsstarwars",
  "Angry Birds Star Wars - Rovio Entertainment Ltd"]]

这是有效的,因为我正在浏览entry标签。对于每个entry,我都会查找id标签并记住它,这样就可以轻松地反复查看idbundleID参数。e然后这是一个在内部寻找title标签的简单案例。

我确信它可以使用一些时髦的 XPath 来完成,但我是凡人并且喜欢保持简单。

于 2012-11-15T00:22:32.963 回答