Nokogiri pull parser (Nokogiri :: XML :: Reader) проблема с самозакрывающимся тегом - PullRequest
1 голос
/ 05 мая 2010

У меня огромный XML (> 400 МБ), содержащий продукты. Поэтому использование синтаксического анализатора 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, и я не могу найти какой-либо другой дискриминатор в документации .

Есть идеи, как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 12 августа 2010

Привет, Влад, я не эксперт по Nokogiri, но я провел тест и увидел, что метод self_closing? () Отлично работает для определения самозакрывающихся тегов. Попробуйте.

P.S. : Я знаю, что это старый пост: P / документация ЗДЕСЬ

1 голос
/ 14 мая 2010

На странице проекта имеется запрос об этой проблеме (с соответствующим провальным тестом ).

Пока это не будет исправлено и вставлено в текущую версию, мы будем придерживаться good'ol

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