假设我有以下 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。因此,无论它位于哪个图书馆,内部的“书”循环都会命中每一本书。此外,一旦我进入第二个图书馆,“书”循环就会再次从文档的开头开始并继续遍历每本书。最终结果是我得到了正确数量的正确名称的图书馆,但每个图书馆都有每一本书。当我点击一个新的“图书馆”标签时,我需要一种方法来停止搜索书籍(从内部循环中断)。
是否有与 .css() 不同的方法可以做到这一点?有没有办法在我的循环中写一个 break 语句来在给定的情况下退出?