Thread XML mit unterschiedlichen Knoteninhalten parsen
(12 answers)
Opened by schnerd at 2012-07-19 18:32
Hier mal eine Funktionstüchtige Variante:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 #!/usr/bin/perl # Module verwenden use strict; use warnings; use XML::Simple; use Data::Dumper; # Bearbeitungsdatei definieren my $path = "dump.xml"; # Bearbeitungsdatei einlesen und nach Regeln aufbauen um diese dann in while einzeln anzusprechen und abzufragen my $data = XMLin($path, KeyAttr => ['Rule_Number'], ForceArray => ["reference"]); # TestAusgabe um die Struktur zu sehen # am besten in eine Datei umlenken #print Dumper($data); exit(); # Nur die Daten unterhalb dieses Knotens sind interessant my $ref_base = $data->{fw_policie}->{rule}->{rule}; # alle Schlüssel des Hash sortieren und durch gehen for my $i (sort {$a <=> $b} keys(%{$ref_base})) { # Testausgabe um zu sehen, wo ein Fehler auftritt # im gespeicherten Dump kann man dann nach der Nummer suchen # und sich die Struktur anschauen #print "$i\n"; # nur das interessate # man ist ja Tippfaul my $ref = $ref_base->{$i}; # durch ForceArray => ["reference"] # wurde ja gezwungen, dass alle "reference" Elemente ein Array sein müssen # das muss man bei der Abfrage beachten if ($ref->{src}->{members}->{reference}) { for my $member (@{$ref->{src}->{members}->{reference}}) { print "Quelle: ", $member->{Name}, "\n"; } } elsif ($ref->{src}->{compound}->{compound}) { print "Quelle: ", $ref->{src}->{compound}->{compound}->{Name}, "\n"; } if ($ref->{dst}->{members}->{reference}) { for my $member (@{$ref->{dst}->{members}->{reference}}) { print "Ziel: ", $member->{Name}, "\n"; } } elsif ($ref->{dst}->{compound}->{compound}) { print "Ziel: ", $ref->{dst}->{compound}->{compound}->{Name}, "\n"; } print "\n"; } |