2010-05-05 74 views
1

我有一个巨大的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中找到任何其他鉴别符。

有关如何解决此问题的任何想法?

+2

我发现这个功能要求:http://github.com/tenderlove/nokogiri/issues/#issue/262 – 2010-05-05 17:19:08

+0

的唯一方法是检查内容是空的或不是。 – 2015-02-02 18:08:40

回答

1

项目页面上有关于此问题的feature request(与相应的failing test)。

直到它被固定并推入目前的版本中,我们将与good'ol坚持

input_text.gsub! /<([^<>]+)\/>/, '<\1></\1>' 
1

嘿弗拉德,还有我不是一个引入nokogiri专家,但我已经做了测试和锯self_closing?()方法在确定自闭标签方面工作良好。试一试。

P.S. :我知道这是一个老帖子:P /文档是HERE