Font
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]10759[/thread]

Verarbeitung der Daten aus einer XML-Datei

Reader: 1


<< >> 5 entries, 1 page
maio
 2007-11-09 14:39
#102118 #102118
User since
2007-11-09
2 articles
BenutzerIn
[default_avatar]
Hallo zusammen,

ich habe mir ein Script geschrieben, welches mir eine XML Datei ausließt. Es ist eine einfache XML Datei mit Tags und Werten. Es können aber Tags doppelt vorkommen.

Code: (dl )
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<config>
<tag1>hallo</tag1>
<tag2>welt</tag2>
<url><![CDATA[http://www.google.de/]]></url>
<list_1>123</list_1>
<list_1>456</list_1>
<list_1>789</list_1>
</config>


Nun möchte ich immer die keys und values zusammen ausgeben. Das funktioniert soweit mit dem Script unten auch prima. Wenn ich jetzt aber use strict verwenden möchte, geht es nicht mehr.

Kann mit jmd sagen, an was das liegt? Meine Perl-Kenntnisse sind leider nicht so gut.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl

use XML::Simple;

my $xml = XML::Simple->new;
my $hashref = $xml->XMLin("test.xml");

foreach my $key (keys %$hashref) {
        if (@{$hashref->{$key}} > 0) {
                my @tmp = @{$hashref->{$key}};
          foreach my $value (@tmp) {
                        print $key." => ".$value."\n";
                }
        } else {
          print $key." => ".$hashref->{$key}."\n";
        }
}


Vielen Dank im Voraus.
Gruß, maio
renee
 2007-11-09 14:49
#102120 #102120
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Du versuchst, aus dem String "hallo" ein Array @hallo zu bekommen. So etwas nennt man symbolische Referenz. Dazu am besten mal diesen Wiki:Artikel lesen...

strict erlaubt solche symbolischen Referenzen nicht. Deswegen läuft das Programm unter strict nicht. Du hast zwei Möglichkeiten, wie Du es auch unter strict zum Laufen bringst:

1) Du überprüfst erst, ob Du überhaupt eine Arrayreferenz vorliegen hast:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl

use strict;
use warnings;
use XML::Simple;

my $xml = XML::Simple->new;
my $hashref = $xml->XMLin('test.xml');

foreach my $key (keys %$hashref) {
        if ( ref($hashref->{$key}) eq 'ARRAY' and @{$hashref->{$key}} > 0) {
                my @tmp = @{$hashref->{$key}};
          foreach my $value (@tmp) {
                        print $key." => ".$value."\n";
                }
        } else {
          print $key." => ".$hashref->{$key}."\n";
        }
}


2) Du zwingst CPAN:XML::Simple dazu, *immer* eine Arrayreferenz zu verwenden:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl

use strict;
use warnings;
use XML::Simple;

my $xml = XML::Simple->new;
my $hashref = $xml->XMLin('test.xml', force_array => 1);

foreach my $key (keys %$hashref) {
        if ( @{$hashref->{$key}} > 0) {
                my @tmp = @{$hashref->{$key}};
          foreach my $value (@tmp) {
                        print $key." => ".$value."\n";
                }
        }
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
maio
 2007-11-09 15:59
#102124 #102124
User since
2007-11-09
2 articles
BenutzerIn
[default_avatar]
Das ging ja schnell.

Vielen Dank für die Info. Funktioniert einwandfrei :)

Gruß, maio
nepos
 2007-11-09 15:59
#102125 #102125
User since
2005-08-17
1420 articles
BenutzerIn
[Homepage] [default_avatar]
Am besten benutzt du XML::Simple gleich so:
Code (perl): (dl )
use XML::Simple qw(:strict);

Damit meckert er dir dann ein paar Dinge an, die man gerne falsch macht ;)

@renee: Bei ForceArray sollte man wenn möglich [] oder [ 'irgendwas' ] benutzen.
renee
 2007-11-09 16:07
#102126 #102126
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
nepos+2007-11-09 14:59:41--
@renee: Bei ForceArray sollte man wenn möglich [] oder [ 'irgendwas' ] benutzen.

Dann geht hier aber der Sinn verloren wenn man jedes einzelne Element aufführen muss. Hier ist es ja extra so gewollt, dass wirklich *alles* in einer Arrayreferenz stehen soll!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 5 entries, 1 page



View all threads created 2007-11-09 14:39.