我有一個巨大的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