製品を含む巨大な XML (>400MB) があります。したがって、DOMパーサーを使用することは除外されているため、プルパーサーを使用して解析および処理しようとしました。each_product(&block)
以下は、製品リストを反復処理するメソッドのスニペットです。
基本的にスタックを使って、各<product> ... </product>
ノードをハッシュに変換して処理します。
while (reader.read)
case reader.node_type
#start element
when Nokogiri::XML::Node::ELEMENT_NODE
elem_name = reader.name.to_s
stack.push([elem_name, {}])
#text element
when Nokogiri::XML::Node::TEXT_NODE, Nokogiri::XML::Node::CDATA_SECTION_NODE
stack.last[1] = reader.value
#end element
when Nokogiri::XML::Node::ELEMENT_DECL
return if stack.empty?
elem = stack.pop
parent = stack.last
if parent.nil?
yield(elem[1])
elem = nil
next
end
key = elem[0]
parent_childs = parent[1]
# ...
parent_childs[key] = elem[1]
end
<country/>
「通常の」タグと「自己終了」タグの違いがわからないため、問題は自己終了タグ(EG )にあります。どちらもタイプであり、ドキュメントNokogiri::XML::Node::ELEMENT_NODE
で他の識別子を見つけることができません。
この問題を解決する方法についてのアイデアはありますか?