2011-03-16 99 views
1

REXML應該忽略標識還是空格?解析REXML文檔,忽略空白

我在調試simple HTML to Markdown convertor的問題。出於某種原因,它無法在

<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需要whitespacing和identation:爲什麼別人它會解析與後者不同的第一個XML嗎?

我可以強制REXML解析兩者嗎?或者我正在尋找一種完全不同的錯誤?

+1

顯示演示問題的代碼示例。另外,你可能應該使用[Nokogiri](http://nokogiri.org)。這是一個很棒的XML/HTML解析器,正在迅速成爲事實上的選擇。 – 2011-03-16 19:15:22

+0

我已經添加了一個精簡的例子。關於Nokogiri:我也喜歡那個。但是這不是我的腳本,我想簡單地修復它,而不是重寫它來使用不同的XML庫:) – berkes 2011-03-16 19:38:04

回答

1

嘗試將選項ignore_whitespace_nodes =>:all傳遞給Document.new()。

+0

這並不能解決問題;文檔中提到的是「:ignore_whitespace_nodes」? – berkes 2013-05-28 16:47:33

+0

爲我工作(MRI 2.0.0-p481)。 – 2014-10-29 01:50:40