带有自关闭标记的 Nokogiri 拉取解析器 (Nokogiri::XML::Reader) 问题

Nokogiri pull parser (Nokogiri::XML::Reader) issue with self closing tag

提问人:Vlad Zloteanu 提问时间:5/6/2010 更新时间:8/12/2010 访问量:1770

问:

我有一个巨大的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

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

Ruby-on-rails Ruby Nokogiri XML 解析

评论

2赞 Vlad Zloteanu 5/6/2010
我找到了这个功能请求:github.com/tenderlove/nokogiri/issues/#issue/262
0赞 Casimir et Hippolyte 2/3/2015
唯一的方法是检查内容是否为空。

答:

1赞 Vlad Zloteanu 5/14/2010 #1

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

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

input_text.gsub! /<([^<>]+)\/>/, '<\1></\1>'
1赞 Gerasimos 8/12/2010 #2

嘿弗拉德,好吧,我不是 Nokogiri 专家,但我做了一个测试,看到self_closing?() 方法在确定自闭合标签时效果很好。试一试。

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