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

XML::Twig

Leser: 10


<< >> 5 Einträge, 1 Seite
Gast Gast
 2007-12-05 17:32
#103478 #103478
Hi,

ich hab eine xml Datei (zu groß für XML::Simple) und versuche mit CPAN:XML::Twig auf einzelne Elemente/Attribute zu zugreifen.

xml:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
                ...
</server>
<server type="0x1" address="86.210.65.68" status="UP">
<hostname>86.210.65.68</hostname>
...
<name>Server.com</name>
<rules>
<rule name="protocol">7</rule>
...
<rule name="dedicated">1</rule>
<rule name="os">linux</rule>
</rules>
</server>
<server type...


Sehe aber gearde den Wald vor lauter XML::Twing Methoden nicht. Wie komm ich z.B. an den "status", "hostname" und an das "os"?

Hier mein Versuch:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl -w
use strict;
use XML::Twig;

my $twig = new XML::Twig( TwigRoots => { 'server' => \&output_srv });
$twig->parsefile("myfile.xml");

sub output_srv {
    my( $tree, $elem ) = @_;
    my $status = $elem->{att}->{'status'}, "\n";
    my $hostname  = $elem->elt_id('hostname')->text || '';
    my $os  = $elem->elt_id('os')->text || '';
    print "Host: $hostname    Status: $status    OS: $os\n";
}


Freue mich über jede Idee.
Gast Gast
 2007-12-06 11:07
#103496 #103496
Oder kann jemand einen anderen XML Stream Parser empfehlen, um das Problem zu lösen?
jan
 2007-12-06 14:09
#103502 #103502
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich bin zwar auch noch nicht lange mit XML::Twig am arbeiten aber von der herangehensweise liegt es mir mehr als andere, daher setze ich mich damit auseinander ... nur als warnung deshalb, mein code ist sicher nicht der optimalste ;)

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl -w
use strict;
use XML::Twig;

my $twig = new XML::Twig( TwigRoots => { 'server' => \&output_srv });
$twig->parsefile("myfile.xml");

sub output_srv {
    my( $tree, $elem ) = @_;
    my $status = $elem->att('status') . "\n";
    my $hostname  = $elem->findvalue('hostname') || '';
    my $os  = $elem->findvalue('rules/rule[@name="os"]') || '';
    print "Host: $hostname    Status: $status    OS: $os\n";
}


gets the job done. allerdings solltest du wohl möglich austesten, ob nicht mehrere hostname-elemente etc vorkommen können, falls das nicht generell ausgeschlossen werden kann.
ptk
 2007-12-06 21:46
#103529 #103529
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Das SAX-Interface von XML::LibXML sollte gut genug sein.
Gast Gast
 2007-12-08 15:11
#103633 #103633
Thx Jan, dein Code funzt. Hab noch ein "$tree->flush;" am Ende eingefügt und der Speicherverbrauch ist minimal :D

Bei einer 30MB großen XML Datei, waren 1 GB Ram für meine ersten Versuche mit XML::Simple nicht ausreichend.
<< >> 5 Einträge, 1 Seite



View all threads created 2007-12-05 17:32.