2010-08-04 12 views
5

İçinde çok sayıda dizi referansı bulunan bir dizi referansım var. Yuvalanmış dizi referansları ayrıca dizi referanslarını içerir. (Bu XML::Parser ait tree tarzıdır.)XML :: Parser tarafından oluşturulan ayrıştırma ağacına nasıl erişirim?

my $Filename = "sample.xml"; 

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

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

İşte $Tree dizi o dizi referans, içeriği ve tüm xml dosyasına bağlıdır iç içe derinlik olacak referans olduğunu. Yuvalanmış dizi $Tree arasında geçiş yapmak ve içeriği yazdırmak istiyorum.

+0

Örnek dosyanızı veya bir parça metnini ekleyebilirsiniz. –

+0

Sadece bir xml dosyası. Herhangi bir xml dosyası ile deneyebilirsiniz. –

+0

Yeni XML :: Parser (Style => 'tree') 'yerine' XML :: Parser-> new (Style => 'tree') 'kullanmalısınız. Dolaylı nesne sözdizimi, garip hatalara yol açabilir. – cjm

cevap

5

İşte basit sürümü: Eğer $attrHash üzerinden erişebilecek her ne kadar

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

Bu, özelliklerini ekrana gelmez. Ayrıca metindeki varlıkları da kodlamaz, sonuçta ortaya çıkan çıktı muhtemelen iyi biçimlendirilmiş XML olmayacaktır. Bunları okuyucunun alıştırmaları olarak bırakıyorum. :-)

+0

İyi iş arkadaşı. İhtiyacım için değiştireceğim. –