0

次の XML ドキュメントがあるとします。Ruby 1.9.3、Rails 3.2.6、および Nokogiri 1.5.5 を使用して、XML をデータベースに解析しています。XML タグをループして、正しい順序で要素を選択できるようにしたいと考えています。

<?xml version="1.0"?>
<RandomTag>
    <library name='Favorite Books'>
        <book ISBN="11342343">
          <title>TKAM</title>
          <description>Desc1</description>
          <author>H Lee</author>
        </book>
        <book ISBN="989894781234">
          <title>Catcher in the Rye</title>
          <description>Desc2</description>
          <author>JD S</author>
        </book>
    </library>
    <library name='Other Books'>
        <book ISBN="123456789">
          <title>Murphy\'s Gambit</title>
          <description>Desc3</description>
          <author>Syne M</author>
        </book>
    </library>
</RandomTag>

次のようなループを使用して繰り返します。

f = File.open(args[:file])
doc = Nokogiri::XML(f)
f.close

doc.css('library').each do |node|
  children = node.children
  lib = {"name" => node['name']}
  Library.create(lib)

  doc.css('book').each do |n|
    churn = n.children
    book = {#book elements}
    Book.create(book)
  end
end

つまり、基本的に図書館を探していて、それが見つかったら、その図書館内のすべての本を検索しています。私の現在のコードの問題は、.css() メソッドが EOF まで検索することです。したがって、内部の「本」ループは、それが存在するライブラリに関係なく、すべての本にヒットします。さらに、2 番目のライブラリにヒットすると、「本」ループが再びドキュメントの最初から始まり、すべての本に続きます。最終結果は、正しい名前の正しい数の図書館を取得しますが、すべての図書館にはすべての本があります。新しい「ライブラリ」タグにヒットしたときに、本の検索を停止する (内側のループから抜け出す) 方法が必要です。

これを行う .css() 以外の方法はありますか? 特定の状況で終了するために、ループ内に break ステートメントを書き込む方法はありますか?

4

2 に答える 2

2

あなたが呼んでいるので、あなたはすべての本を見つけています

doc.css('book')

定義上、ドキュメント内の任意の本を検索します。特定の要素内の本だけを見つけたい場合は、それを呼び出します.css

doc.css('library').each do |library_node|
  library_node.css('book').each do |book_node|
    #only iterates on the books inside that library
  end
end
于 2012-07-11T07:18:49.777 に答える
1

ここに表示されているのはイテレータです。メソッドは、見つかったすべての属性を反復処理します。

nokogiri が列挙可能なモジュールをサポートしている場合、使用できる他の方法がいくつかあります。

http://apidock.com/ruby/Enumerable

あなたの場合、最初に一致する要素だけを使用するために find を使用します。

于 2012-07-10T21:41:14.820 に答える