2010-05-05 78 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