제품이 포함 된 거대한 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에서 찾을 수 없습니다.
이 문제를 해결하는 방법에 대한 아이디어가 있으십니까?
입니다 : http://github.com/tenderlove/nokogiri/issues/#issue/262 –
유일한 방법은 있는지 확인하는 것입니다 내용이 비어 있거나 없습니다. –