1

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 に両方を同じように解析させることはできますか? それとも、まったく別の種類のバグを見ているのでしょうか?

4

1 に答える 1

1

オプション :ignore_whitespace_nodes=>:all を Document.new() に渡してみてください。

于 2013-05-28T07:36:41.140 に答える