Come faccio ad avere la somma di tutti i contenuti durante l'analisi di un tag XML in Ruby?

StackOverflow https://stackoverflow.com/questions/951220

  •  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.

È stato utile?

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"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top