REXML は ID または空白文字を無視する必要がありますか?
単純な 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 に両方を同じように解析させることはできますか? それとも、まったく別の種類のバグを見ているのでしょうか?