2009-06-04 78 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

相关问题