Schrift
[thread]10759[/thread]

Verarbeitung der Daten aus einer XML-Datei

Leser: 1


<< >> 5 Einträge, 1 Seite
maio
 2007-11-09 14:39
#102118 #102118
User since
2007-11-09
2 Artikel
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 Artikel
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 Artikel
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 Artikel
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 Artikel
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 Einträge, 1 Seite



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