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

¿Fue útil?

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"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top