2010-05-05 1 views
1

제품이 포함 된 거대한 XML (> 400MB)이 있습니다. 따라서 DOM 파서를 사용하는 것은 제외되므로 끌어서 파서를 사용하여 구문 분석하고 처리하려고했습니다. 아래는 제품 목록을 반복하는 each_product(&block) 방법의 스 니펫입니다.Nokogiri pull parser (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 –

+0

유일한 방법은 있는지 확인하는 것입니다 내용이 비어 있거나 없습니다. –

답변

1

이 문제와 관련하여 프로젝트 페이지에 feature request (해당 failing test 포함)이 있습니다. 이 고정 현재 버전으로 밀려 것까지

우리는

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

가 블라드 안녕하세요, 잘 나는 노코 기리 전문가가 아니다 good'ol 맡기 겠소 그러나 나는 시험과 톱을 완료했습니다 self_closing?() 메소드는 자동 닫기 태그를 결정할 때 잘 작동합니다. 시도 해봐.

P. :이 이전 게시물 알고 : P/문서 내가이 기능 요청을 발견 HERE