¿Cómo consigo la suma de todos los contenidos al analizar una etiqueta XML en Ruby?
-
11-09-2019 - |
Pregunta
Tengo un poco de XHTML (pero en realidad cualquier XML va a hacer) como esto:
<h1>
Hello<span class='punctuation'>,</span>
<span class='noun'>World<span class='punctuation'>!</span>
</h1>
¿Cómo puedo obtener el contenido completo de la <h1/>
como una cadena en Ruby? Como en:
assert_equal "Hello, World!", h1_node.some_method_that_aggregates_all_content
¿Alguno de los marcos XML ( Nokogiri , libxml-rubí , etc.) tienen este tipo de cosas incorporada? Si no es así, me siento como un Y-Combinator podría la herramienta correcta para el trabajo, pero no puedo averiguar por lo que se vería así.
Solución
Con Nokogiri que sólo puede pedir la text
de un nodo. El problema que veo cuando haciendo que sin embargo es que todos los espacios en blanco y saltos de línea que se encuentran en ese nodo será devuelto, así que sería bueno para despojar a los fuera (probablemente una mejor manera de hacerlo que lo que hice para este ejemplo).
A continuación se muestra un ejemplo:
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
Otros consejos
Nokogiri :: :: XML Nodo # contenido de Nokogiri lo hará:
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"