1

我有一个包含产品的巨大 XML(>400MB)。因此,使用 DOM 解析器被排除在外,所以我尝试使用拉解析器来解析和处理它。each_product(&block)下面是我迭代产品列表的方法的一个片段。

基本上,使用堆栈,我将每个<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,我无法在文档中找到任何其他鉴别器。

关于如何解决这个问题的任何想法?

4

2 回答 2

1

项目页面上有关于此问题的功能请求(带有相应的失败测试)。

在它被修复并推送到当前版本之前,我们将坚持使用 good'ol

input_text.gsub! /<([^<>]+)\/>/, '<\1></\1>'
于 2010-05-14T12:11:43.197 回答
1

嘿,弗拉德,好吧,我不是 Nokogiri 专家,但我做了一个测试,发现 self_closing?() 方法可以很好地确定自闭标签。试试看。

PS:我知道这是一篇旧帖子:P/文档在这里

于 2010-08-12T13:56:32.833 回答