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

<country/>「通常の」タグと「自己終了」タグの違いがわからないため、問題は自己終了タグ(EG )にあります。どちらもタイプであり、ドキュメントNokogiri::XML::Node::ELEMENT_NODEで他の識別子を見つけることができません。

この問題を解決する方法についてのアイデアはありますか?

4

2 に答える 2

1

この問題に関する機能要求がプロジェクトページにあります(対応する失敗したテストを含む)。

それが修正されて現在のバージョンにプッシュされるまで、私たちは良い'olに固執します

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

Vlad さん、私は Nokogiri の専門家ではありませんが、テストを行ったところ、self_closing?() メソッドが自己終了タグの決定に問題なく機能することがわかりました。試してみる。

PS : これが古い投稿であることはわかっています :P / ドキュメントはこちら

于 2010-08-12T13:56:32.833 に答える