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

XML::DOM

Tags: Ähnliche Threads

Leser: 1


<< >> 7 Einträge, 1 Seite
the_brain
 2004-08-19 12:40
#49407 #49407
User since
2004-08-19
30 Artikel
BenutzerIn
[Homepage] [default_avatar]
hi

ich habe ein kleines problem mit XML::DOM - ich kann zwar das Tag auslesen, aber den Wert nicht.

Die XML-Datei hat folgende Struktur:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
Spieldefinitionen fuer das LAN-Admin System
http://www.lanadminsystem.de
-->
<lanas>
<game gameid='1'>
<id>HL</id>
<name>Half-Life</name>
<mapcycle>mapcycle.txt</mapcycle>
<remote>1</remote>
<qstat>hls</qstat>
<lvs>1</lvs>
<rcon>1</rcon>
<query>hlm</query>
<gport>27015</gport>
<exe>hlds_run</exe>
<map_param>+map</map_param>
<config_param>+exec</config_param>
<other_param>-noipx +sv_lan 1 -nomaster</other_param>
<mod_param>-game</mod_param>
</game>
</lanas>


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
      my $parser = XML::DOM::Parser->new();
my $doc = $parser->parsefile( $file );
my $root = $doc->getDocumentElement();
my $nodes = $root->getElementsByTagName ("game");
my $n = $nodes->getLength();
my @games = $root->getChildNodes();

for (my $i = 0; $i < $n; $i++)
{
my $node = $nodes->item ($i);
my $href = $node->getAttributeNode ("gameid");
$game_id = $href->getValue();
foreach my $child( $games[$i]->getChildNodes() )
{
my $name = $child->getNodeName();
my $value = $child->getNodeValue();
Lanas::Debug->debug("[CONFIG.PM](spiele) ".$child->toString() ."($i/$game_id) $name: $value",4);
$games{ $game_id }->{$name} = $value;
}
}
$doc->dispose;


den namen vom tag kann ich damit wunderbar auslesen aber

Code: (dl )
my $value = $child->getNodeValue();


liefert keinen wert - woran kann das liegen?

wäre für eure hilfe dankbar


http://www.lanadminsystem.de
Crian
 2004-08-19 13:11
#49408 #49408
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Herzlich willkommen im Forum, endlich ist hier Hirn vorhanden ;)

Ich kann nur raten da ich das Modul nicht kenne: Das Child hat ja keinen Tag, vielleicht muss man sich den Inhalt dann anders erfragen? perldoc MODULNAME hilft Dir da bestimmt weiter.\n\n

<!--EDIT|Crian|1092906712-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ptk
 2004-08-19 13:25
#49409 #49409
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich kann auch nur raten --- aber ich denke, dass der zum Tag zugehoerige Text selbst ein Childnode des Tags ist.
the_brain
 2004-08-19 14:16
#49410 #49410
User since
2004-08-19
30 Artikel
BenutzerIn
[Homepage] [default_avatar]
und wie frage ich den dann ab?
kennt sich jemand näher mit dem modul aus?

gruss und danke für die bisherigen antworten

martin
the_brain
 2004-08-19 14:17
#49411 #49411
User since
2004-08-19
30 Artikel
BenutzerIn
[Homepage] [default_avatar]
Code: (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
            Lanas::Debug->debug("[CONFIG.PM](spiele) Benutze XML::DOM",4);
my $parser = XML::DOM::Parser->new();
my $doc = $parser->parsefile( $file );
my $root = $doc->getDocumentElement();
my $nodes = $root->getElementsByTagName ("game");
my $n = $nodes->getLength();
my @games = $root->getChildNodes();

for (my $i = 0; $i < $n; $i++)
{

my $node = $nodes->item ($i);

my $href = $node->getAttributeNode ("gameid");

$game_id = $href->getValue();

Lanas::Debug->debug( "[TO_STRING] $i ".$games[$i]->toString(),4);

foreach my $child( $games[$i]->getChildNodes() )

{

$name = $child->toString();

$name =~ m,<(.*?)>(.*?)</(.*?)>,;

$name = $1;

$value = $2;

if (!$name || !$value)

{

next;

}

$name =~ s/^\W//g;

$name =~ s/\W$//g;

$value =~ s/^\W//g;

$value =~ s/\W$//g;

Lanas::Debug->debug("[CONFIG.PM](spiele) ($game_id) ($i/$n) $name: $value",4);

$games{ $game_id }->{$name} = $value;

}
}
$doc->dispose;


so scheint es zu gehen - nur leider überspringt er jetzt jeden 2. eintrag in der xml-datei

gruss
martin
Crian
 2004-08-19 17:06
#49412 #49412
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Auf dieser Seite im CPAN findet man Informationen über das Modul XML::DOM.

Das Dokument Modell findet sich hier.

Und hier gibt es Informationen über den Parser.

Allerdings kenn ich mich mit der Materie nicht genug aus, um Dir weiter zu helfen, aber vielleicht findest Du dort ja irgendwo die Antwort =)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ptk
 2004-08-19 17:37
#49413 #49413
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Quote
Code: (dl )
$name =~ m,<(.*?)>(.*?)</(.*?)>,;

Ich glabe nicht, dass DOM so gedacht war... versuch doch einfach, die children vom Tag-Node zu untersuchen. Ansonsten wuerde ich fuer Konfigurationsdateien lieber YAML als XML verwenden.
<< >> 7 Einträge, 1 Seite



View all threads created 2004-08-19 12:40.