Come faccio ad avere la somma di tutti i contenuti durante l'analisi di un tag XML in Ruby?
-
11-09-2019 - |
Domanda
Ho alcuni XHTML (ma in realtà qualsiasi XML farà) in questo modo:
<h1>
Hello<span class='punctuation'>,</span>
<span class='noun'>World<span class='punctuation'>!</span>
</h1>
Come faccio a ottenere l'intero contenuto del <h1/>
come una stringa in Ruby? Come in:
assert_equal "Hello, World!", h1_node.some_method_that_aggregates_all_content
Eseguire una delle strutture XML ( Nokogiri , libxml-ruby , & c) avere questo genere di cose built-in? In caso contrario, mi sento come un Y-Combinator potrebbe lo strumento giusto per il lavoro, ma non posso non del tutto capire che cosa sarebbe simile.
Soluzione
Con Nokogiri si può solo chiedere la text
di un nodo. Il problema che vedo quando farlo è però che tutti gli spazi e ritorni a capo che si trovano in quel nodo verrà restituito, così si potrebbe desiderare mettere a nudo quelli fuori (probabilmente un modo migliore per farlo se non quello che ho fatto per questo esempio).
Ecco un esempio:
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
Altri suggerimenti
Nokogiri :: XML :: Nodo # lo farà:
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"