Парсер Nokogiri pull (Nokogiri::XML::Reader) проблема с самозакрывающимся тегом

У меня есть огромный 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

Проблема заключается в самозакрывающихся тегах (например, <country/>), так как я не могу отличить «обычный» тег от «самозакрывающегося». Они оба имеют тип Nokogiri::XML::Node::ELEMENT_NODE, и я не могу найти никакого другого дискриминатора в документация.

Любые идеи о том, как решить эту проблему?


person Vlad Zloteanu    schedule 05.05.2010    source источник


Ответы (2)


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

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

input_text.gsub! /<([^<>]+)\/>/, '<\1></\1>'
person Vlad Zloteanu    schedule 14.05.2010

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

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

person Gerasimos    schedule 12.08.2010