Разобрать документ REXML, игнорируя пробелы

Должен ли REXML игнорировать идентификацию или пробелы?

Я устраняю проблему с помощью простого преобразователя HTML в Markdown. Почему-то не получается

<blockquote><p>foo</p></blockquote>

Но не на

<blockquote>
  <p>foo</p>
</blockquote>

Причина в том, что в первом случае type.children.first.value не задано, во втором - установлено. Исходный код можно найти по ссылке выше, но сокращенный фрагмент, показывающий проблему, приведен ниже:

require 'rexml/document'
include REXML

def parse_string(string)
  doc = Document.new("<root>\n"+string+"\n</root>")
  root = doc.root
  root.elements.each do |element|
    parse_element(element, :root)
  end
end

def parse_element(element, parent)
  @output = ''
  # ...
  @output << opening(element, parent)
  #...
end

def opening(type, parent)
  case type.name.to_sym
    #...
    when :blockquote
       # remove leading newline
      type.children.first.value = ""
      "> "
  end
end

#Parses just fine
puts parse_string("<blockquote>\n<p>foo</p>\n</blockquote>")

# Fails with undefined method `value=' for <p> ... </>:REXML::Element (NoMethodError)
puts parse_string("<blockquote><p>foo</p></blockquote>")

Я совершенно уверен, что это связано с некоторым параметром, который заставляет REXML требовать пробелы и идентификацию: почему еще он должен анализировать первый XML, отличный от последнего?

Могу ли я заставить REXML анализировать оба одинаково? Или я смотрю на совсем другую ошибку?


person berkes    schedule 16.03.2011    source источник
comment
Покажите пример кода, демонстрирующий проблему. Кроме того, вам, вероятно, следует использовать Nokogiri. Это отличный синтаксический анализатор XML/HTML, который быстро становится выбором де-факто.   -  person the Tin Man    schedule 16.03.2011
comment
Я добавил сжатый пример. И о Нокогири: я тоже предпочитаю его. Но это не мой скрипт, и я хотел бы просто исправить его, вместо того, чтобы переписывать его, чтобы использовать другую XML-библиотеку :)   -  person berkes    schedule 16.03.2011


Ответы (1)


Попробуйте передать опцию :ignore_whitespace_nodes=>:all в Document.new().

person Community    schedule 28.05.2013
comment
Это не решает проблему; Где в документах упоминается `:ignore_whitespace_nodes`? - person berkes; 28.05.2013
comment
У меня сработало (МРТ 2.0.0-p481). - person Duncan Bayne; 29.10.2014