Thread XML mit unterschiedlichen Knoteninhalten parsen (12 answers)
Opened by schnerd at 2012-07-19 18:32

topeg
 2012-07-20 12:47
#160099 #160099
User since
2006-07-10
2611 articles
BenutzerIn

user image
Hier mal eine Funktionstüchtige Variante:
more (14.1kb):
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";
}

View full thread XML mit unterschiedlichen Knoteninhalten parsen