2009-06-04 4 views
1

Ich habe einige XHTML (aber wirklich jede XML übernommen werden können) wie folgt aus:Wie bekomme ich die Summe aller Inhalte beim Parsen eines XML-Tags in Ruby?

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

Wie kann ich den gesamten Inhalt des <h1/> als String in Ruby bekommen? Wie in:

assert_equal "Hello, World!", h1_node.some_method_that_aggregates_all_content 

Führen Sie einen der XML-Frameworks (Nokogiri, libxml-ruby, & c.) Haben diese Art der Sache built-in? Wenn nicht, habe ich das Gefühl, dass ein Y-Combinator das richtige Werkzeug für den Job ist, aber ich kann nicht genau herausfinden, wie es aussehen würde.

Antwort

3

Mit Nokogiri können Sie einfach nach dem text eines Knotens fragen. Das Problem, das ich dabei sehe, ist, dass alle Whitespaces und Zeilenumbrüche, die sich in diesem Knoten befinden, zurückgegeben werden, also sollten Sie diese entfernen (wahrscheinlich eine bessere Methode als das, was ich für dieses Beispiel getan habe). Hier

ist ein Beispiel:

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

Wenn ich werde alle Zeilenumbrüche in die Räume zu drehen sowieso (was völlig in Ordnung ist, da XML behandelt sie als äquivalent), dann funktioniert h1_note.text.gsub (/ \ s + /, '') .strip gleich und ist etwas schneller, da nicht so viele neue Objekte erstellt werden müssen. –

2

Nokogiri des Nokogiri::XML::Node#content wird es tun:

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 und #content sind gleich, also hat Aaron die "Antwort" b/c bekommen, er hat sich auch um das Leerzeichen gekümmert. +1, obwohl :) –

+0

Plus, schrieb er seine Antwort zuerst. – Pesto

Verwandte Themen