PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PERL - Keys u. Values in mehrdimensionalen Array ansprechen


mii
2012-03-14, 17:52:01
Hallo,

Ich steh momentan aufn Schlauch. Vielleicht hat jemand einen Tipp.

Es gibt eine XML-Struktur a la

<User id="derp">
<ID>1</ID>
<Password>foo</Password>
</User>
<User id="derpina">
<ID>2</ID>
<Password>bar</Password>
</User>

mit XML::Simple lass ich die Daten in Perl wie folgt parsen:


use XML::Simple;
use Data::Dumper;

$xs = new XML::Simple;
$d = $xs->XMLin("index.xml");
print Dumper $d->{User}


Dabei kommt folgendes raus:

$VAR1 = {
'derpina' => {
'ID' => '2',
'Password' => 'bar'
},
'derp' => {
'ID' => '1',
'Password' => 'foo'
}
};


Ich würde jetzt gerne derp, id und pw gerne einzeln verwertbar haben.

Also eine Schleife und die bei jedem Durchlauf dann die Werte des nächsten Users hat in einer einfachen Variable.

Allerdings steh ich komplett aufn schlauch wie ich das array jetzt ansprechen soll. Bisherige Recherchen brachten mich nicht weiter.

Danke.

Gast
2012-03-14, 20:02:24
http://search.cpan.org/~grantm/XML-Simple-2.18/lib/XML/Simple.pm#EXAMPLES

-> $d->{User} ist ein Array(-Ref?) mit 2 Hash-Refs.

d.h. du müsstest das Passwort des n-ten Users so bekommen (Schleife traue ich dir mal selbst zu ;) ) :
$d->{User}[n]->{'Password'}
vll auch: $d->{User}->[n]->{'Password'} denn eigentlich müsste dort ein Array-Ref sein und kein "direktes" Array

mii
2012-03-19, 17:43:49
Danke Gast. Deine Tipps haben mich weiter gebracht.

Es kam zwar die Fehlermeldung: "Not an ARRAY reference at foo.pl line XX"
Aber nach ein wenig googlen fand ich ähnliche Probleme. Mit kayattr kann das Problem umgehen.

$xs = new XML::Simple(KeyAttr=>[]);

der gedumpte Output sieht so aus (print Dumper $d->{User}):
$VAR1 = [
{
'ID' => '1',
'Password' => 'foo',
'id' => 'derp'
},
{
'ID' => '2',
'Password' => 'bar',
'id' => 'derpina'
}
];

Ansprechen kann man die Elemente dann mit:

print $d->{User}[0]->{ID}

Vielleicht hilft es irgendwem nochmal weiter der das selbe Problem hat. :)