2009-06-04 59 views
1

我有一些XHTML(但實際上任何XML會做)這樣的:如何在Ruby中解析XML標記時獲取所有內容的總和?

<h1> 
    Hello<span class='punctuation'>,</span> 
    <span class='noun'>World<span class='punctuation'>!</span> 
</h1> 

如何獲得<h1/>的全部內容在Ruby中的字符串?如:

assert_equal "Hello, World!", h1_node.some_method_that_aggregates_all_content 

做任何的XML框架(Nokogirilibxml-ruby,&角)有這種事情內置的?如果不是這樣,我覺得像Y-Combinator可能是適合這項工作的正確工具,但我無法弄清楚它會是什麼樣子。

回答

3

與Nokogiri,你可以問一個節點的text。但是,我這樣做時遇到的問題是,該節點中的所有空白和換行符都將被返回,因此您可能需要刪除這些內容(可能是比我爲此示例做的更好的方法)。

這裏有一個例子:

def test_nokogiri_text 
    value = Nokogiri::HTML.parse(<<-HTML_END) 
    "<h1> 
     Hello<span class='punctuation'>,</span> 
     <span class='noun'>World<span class='punctuation'>!</span> 
    </h1>" 
    HTML_END 

    h1_node = value.search("h1").first 
    assert_equal("Hello, World!", h1_node.text.split(/\s+/).join(' ').strip) 
end 
+0

如果我將要開啓所有的換行到反正空間(這是完全正常的,因爲XML將它們視爲等價物),那麼h1_note.text.gsub(/ \ s + /,'').strip的工作原理相同,速度稍快,因爲它不需要創建許多新對象。 – 2009-06-04 17:19:52

2

引入nokogiri的Nokogiri::XML::Node#content將做到這一點:

irb(main):020:0> node 
=> <h1> 
    Hello<span class="punctuation">,</span> 
    <span class="noun">World<span class="punctuation">!</span> 
</span> 
</h1> 
irb(main):021:0> node.content 
=> "\n Hello,\n World!\n\n" 
+0

#text和#content是一樣的,所以Aaron得到了「答案」B/C他也照顧了空白。 +1,雖然:) – 2009-06-04 17:16:44

相關問題