Nokogiri pull 解析器 (Nokogiri::XML::Reader) 存在自关闭标签问题

发布于 2024-08-31 14:12:10 字数 1177 浏览 5 评论 0 原文

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

基本上,使用堆栈,我将每个 转换为... 节点转换为哈希并对其进行处理。

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 ),因为我无法区分“正常”标签和“自闭合”标签。它们都是 Nokogiri::XML::Node::ELEMENT_NODE 类型,我无法在 文档

关于如何解决这个问题有什么想法吗?

I have a huge XML(>400MB) containing products. Using a DOM parser is therefore excluded, so i tried to parse and process it using a pull parser. Below is a snippet from the each_product(&block) method where i iterate over the product list.

Basically, using a stack, i transform each <product> ... </product> node into a hash and process it.

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

The issue is on self-closing tags (EG <country/>), as i can not make the difference between a 'normal' and a 'self-closing' tag. They both are of type Nokogiri::XML::Node::ELEMENT_NODE and i am not able to find any other discriminator in the documentation.

Any ideas on how to solve this issue?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

听风念你 2024-09-07 14:12:10

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

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

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

There is a feature request on project page regarding this issue (with the corresponding failing test).

Until it will be fixed and pushed into the current version, we'll stick with good'ol

input_text.gsub! /<([^<>]+)\/>/, '<\1></\1>'
残疾 2024-09-07 14:12:10

嘿,Vlad,我不是 Nokogiri 专家,但我做了一个测试,发现 self_looking?() 方法在确定自关闭标签方面效果很好。尝试一下。

PS:我知道这是一篇旧文章:P/文档是 这里

Hey Vlad, well I am not a Nokogiri expert but I've done a test and saw that the self_closing?() method works fine on determining the self closing tags. Give it a try.

P.S. : I know this is an old post :P / the documentation is HERE

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文