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:idim:bundleIdに興味があります。<title>

これが機能する段階に到達することができました:

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

問題は、コンテンツを取得するには、個別titleに反復処理する必要があることです。エントリを繰り返し処理してから、データをxml.css("entry title")引き出して同じループに入れる方法はありますか?idtitle

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を繰り返し調べるのが簡単になります。次に、タグの内部を調べる単純なケースです。idbundleIDetitle

ファンキーなXPathを使用して実行できると確信していますが、私は死ぬので、シンプルに保つのが好きです。

于 2012-11-15T00:22:32.963 に答える