Разбор REXML документа, игнорируя пробелы - PullRequest
1 голос
/ 16 марта 2011

Должен ли 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 анализировать оба одинаково? Или я смотрю на совершенно другой вид ошибки?

1 Ответ

1 голос
/ 28 мая 2013

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

...