У меня огромный XML (> 400 МБ), содержащий продукты. Поэтому использование синтаксического анализатора 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
Проблема связана с самозакрывающимися тегами (EG <country/>
), поскольку я не могу сделать различие между «обычным» и «самозакрывающимся» тегом. Они оба имеют тип Nokogiri::XML::Node::ELEMENT_NODE
, и я не могу найти какой-либо другой дискриминатор в документации .
Есть идеи, как решить эту проблему?