2010-08-04 7 views
5

Tengo una matriz de referencia que tiene un número de referencias de matriz dentro de ella. Las referencias de matriz anidadas también contienen las referencias de matriz. (Este es el estilo tree de XML::Parser.)¿Cómo accedo a un árbol de análisis sintáctico creado por XML :: Parser?

my $Filename = "sample.xml"; 

my $Parser = new XML::Parser(Style => 'tree'); 

my $Tree = $Parser->parsefile($Filename); 

Aquí el $Tree es la matriz de referencia que será referencia de matriz, el contenido y la profundidad anidada todo depende del archivo XML. Quiero atravesar la matriz anidada $Tree e imprimir los contenidos.

+0

puede incluir su archivo de muestra o alguna pieza de texto. –

+0

Es simplemente un archivo xml. Puede intentar con cualquier archivo xml. –

+0

Debe usar 'XML :: Parser-> new (Style => 'tree')' en lugar de 'new XML :: Parser (Style => 'tree')'. La sintaxis de objeto indirecto puede conducir a errores extraños. – cjm

Respuesta

5

Aquí hay una versión simplista:

use strict; 
use warnings; 

sub printElement 
{ 
    my ($tag, $content) = @_; 

    if (ref $content) { 
    # This is a XML element: 
    my $attrHash = $content->[0]; 

    print "<$tag>";   # I'm ignoring attributes 

    for (my $i = 1; $i < $#$content; $i += 2) { 
     printElement(@$content[$i, $i+1]); 
    } 

    print "</$tag>"; 
    } else { 
    # This is a text pseudo-element: 
    print $content;    # I'm not encoding entities 
    } 
} # end printElement 

sub printTree 
{ 
    # The root tree is always a 2-element array 
    # of the root element and its content: 
    printElement(@{ shift @_ }); 
    print "\n"; 
} 

# Example parse tree from XML::Parser: 
my $tree = 
    ['foo', [{}, 'head', [{id => "a"}, 0, "Hello ", 'em', [{}, 0, "there"]], 
      'bar', [ {}, 0, "Howdy", 'ref', [{}]], 
      0, "do" 
      ] 
    ]; 

printTree($tree); 

Esto no imprime atributos, si bien se puede acceder a ellos a través $attrHash. Tampoco codifica entidades en el texto, por lo que el resultado resultante probablemente no sea un XML bien formado. Los dejo como ejercicios para el lector. :-)

+0

Buen trabajo compañero. Lo modificaré para mi necesidad. Gracias. –

Cuestiones relacionadas