2010-08-04 5 views
5

Ich habe eine Array-Referenz, die eine Reihe von Array-Referenzen enthält. Die verschachtelten Array-Referenzen enthalten auch die Array-Referenzen. (Dies ist der tree Stil XML::Parser.)Wie greife ich auf einen Syntaxbaum zu, der mit XML :: Parser erstellt wurde?

my $Filename = "sample.xml"; 

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

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

Hier die $Tree ist die Array Referenz wird es Array-Referenz, die Inhalte und die verschachtelte Tiefe alle auf der XML-Datei abhängen. Ich möchte durch das verschachtelte Array $Tree traversieren und den Inhalt ausdrucken.

+0

können Sie Ihre Beispieldatei oder ein Stück Text davon einfügen. –

+0

Es kann einfach eine XML-Datei.Kann mit jeder XML-Datei versuchen. –

+0

Sie sollten 'XML :: Parser-> new (Style => 'tree')' anstelle von 'new XML :: Parser (Style => 'tree')' 'verwenden. Die indirekte Objekt-Syntax kann zu seltsamen Fehlern führen. – cjm

Antwort

5

Hier ist eine stark vereinfachte Version:

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); 

Dies gilt nicht Attribute drucken, obwohl man sie durch $attrHash zugreifen konnte. Es codiert auch keine Entitäten im Text, daher wird die resultierende Ausgabe wahrscheinlich kein wohlgeformtes XML sein. Ich überlasse diese als Übungen für den Leser. :-)

+0

Gute Job-Kumpel. Ich werde es für meine Bedürfnisse ändern. –

Verwandte Themen