¿Cómo puedo aplicar sangría automática a los nodos XML con XML :: LibXML?

Estoy agregando nodos a mi documento XML como parte de un procesamiento interno, pero no puedo obtener XML::LibXML para aplicar sangría automática a los nodos agregados.

Obtengo un resultado como el siguiente:

Esto es lo que estoy obteniendo actualmente $xml->toString( 1 ):

                                    <nested_nodes>
                                        <nested_node>
                                        <configuration>A</configuration>
                                        <model>45</model>
                                        <added_node>
        <ID>
            <type>D</type>
            <serial>3</serial>
            <kVal>3</kVal>
        </ID>
    </added_node>
</nested_node>
                                    </nested_nodes>

Lo que me gustaría tener es una salida bastante impresa:

                            <nested_nodes>
                                <nested_node>
                                    <configuration>A</configuration>
                                    <model>45</model>
                                    <added_node>
                                        <ID>
                                            <type>D</type>
                                            <serial>3</serial>
                                            <kVal>3</kVal>
                                        </ID>
                                    </added_node>
                                </nested_node>
                            </nested_nodes>

La opción $format parámetro para la toString() método documentado en XML::LibXML::Document no parece ayudar.

preguntado el 27 de agosto de 11 a las 14:08

2 Respuestas

Jugué un poco con la configuración y esto parece funcionar:

use XML::LibXML;

my $doc = XML::LibXML->load_xml(string => <<END_XML, { no_blanks => 1 });
                                    <nested_nodes>
                                        <nested_node>
                                        <configuration>A</configuration>
                                        <model>45</model>
                                        <added_node>
        <ID>
            <type>D</type>
            <serial>3</serial>
            <kVal>3</kVal>
        </ID>
    </added_node>
</nested_node>
                                    </nested_nodes>
END_XML

print $doc->toString(1);

El resultado es este:

<?xml version="1.0"?>
<nested_nodes>
  <nested_node>
    <configuration>A</configuration>
    <model>45</model>
    <added_node>
      <ID>
        <type>D</type>
        <serial>3</serial>
        <kVal>3</kVal>
      </ID>
    </added_node>
  </nested_node>
</nested_nodes>

Respondido 28 ago 11, 09:08

¡Excelente! El truco consistía en agregar el no_blanks opción para nodos anidados y agregados. Buen trabajo @bvr! - Zaid

¡Muchas gracias! Como referencia, este archivo de formulario también funciona usando location => $ filename, {no_blanks => 1} - JLZenor

Si no le importa usar otra herramienta, le recomiendo XML :: Ordenado. Hace un trabajo y lo hace bien.

Respondido 27 ago 11, 22:08

Tengo que quedarme con XML::LibXML Desafortunadamente - Zaid

No está disponible en la plataforma de destino y no quiero seguir el camino de incluir el XML::Tidy fuente como parte de mis scripts. - Zaid

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.