Rubyでlibxmlを使用して、(のような)100万を超える小さな書誌レコードを含む大きなXMLファイルを読みたいと思います。<article>...</article>
Readerクラスをメソッドと組み合わせてexpand
レコードごとに読み取る方法を試しましたが、コードがメモリを消費するため、これが正しいアプローチかどうかはわかりません。したがって、私は一定のメモリ使用量でレコードごとに便利に処理する方法のレシピを探しています。以下は私のメインループです:
File.open('dblp.xml') do |io|
dblp = XML::Reader.io(io, :options => XML::Reader::SUBST_ENTITIES)
pubFactory = PubFactory.new
i = 0
while dblp.read do
case dblp.name
when 'article', 'inproceedings', 'book':
pub = pubFactory.create(dblp.expand)
i += 1
puts pub
pub = nil
$stderr.puts i if i % 10000 == 0
dblp.next
when 'proceedings','incollection', 'phdthesis', 'mastersthesis':
# ignore for now
dblp.next
else
# nothing
end
end
end
ここで重要なdblp.expand
のは、サブツリー全体(<article>
レコードなど)を読み取り、それを引数としてファクトリに渡してさらに処理することです。これは正しいアプローチですか?
次に、ファクトリメソッド内で、高レベルのXPathのような式を使用して、以下のように要素のコンテンツを抽出します。繰り返しますが、これは実行可能ですか?
def first(root, node)
x = root.find(node).first
x ? x.content : nil
end
pub.pages = first(node,'pages') # node contains expanded node from dblp.expand