我有一个巨大的XML(> 400MB)包含产品。因此排除使用DOM解析器,所以我尝试使用拉解析器解析和处理它。下面是each_product(&block)
方法的一个片段,我遍历产品列表。Nokogiri拉解析器(Nokogiri :: XML :: Reader)问题与自关闭标记
基本上,使用堆栈,我将每个<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
类型,我无法在documentation中找到任何其他鉴别符。
有关如何解决此问题的任何想法?
我发现这个功能要求:http://github.com/tenderlove/nokogiri/issues/#issue/262 – 2010-05-05 17:19:08
的唯一方法是检查内容是空的或不是。 – 2015-02-02 18:08:40