Thread Perl und der Kampf mit XML (27 answers)
Opened by esskar at 2005-03-11 19:00

esskar
 2005-03-11 19:00
#52571 #52571
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Migriere vom INI-Format zum XML-Format und ich will ganz bestimmt kein XML::Simple benutzen (weil die Reihenfolge der Daten wichtig ist). Momentan benutzte ich XML::Parser. Dies hält zwar die Reihenfolge ein aber die Daten Nutzung ist etwas kompliziert.
konkretes Beispiel:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
<toolbar>
<button id="msg-new" text="New" title="Create and Send a New Message">
<image src="msg-new.gif" width="16" height="16" alt="Create and Send a New Message" />
</button>
<button id="msg-new-drop" title="New" refid="newmsg" dropdown="1" />
<seperator />
<button id="msg-print">
<image src="print.gif" width="16" height="16" alt="Print Selected Message" />
</button>
</toolbar>


$xmltree hat nun folgende Form
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
55
56
57
58
59
60
[
"toolbar",
[
{},
0,
"\n\t",
"button",
[
{
id => "msg-new",
text => "New",
title => "Create and Send a New Message",
},
0,
"\n\t\t",
"image",
[
{
alt => "Create and Send a New Message",
height => 16,
src => "msg-new.gif",
width => 16,
},
],
0,
"\n\t",
],
0,
"\n\t",
"button",
[
{ dropdown => 1, id => "msg-new-drop", refid => "newmsg", title => "New" },
],
0,
"\n\t",
"seperator",
[{}],
0,
"\n\t",
"button",
[
{ id => "msg-print" },
0,
"\n\t\t",
"image",
[
{
alt => "Print Selected Message",
height => 16,
src => "print.gif",
width => 16,
},
],
0,
"\n\t",
],
0,
"\n",
],
]


Mein Code dazu:
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
my $xml = XML::Parser->new(Style => 'Tree');
my $xmltree = $xml->parsefile($filename);
my $toolbar = $xmltree->[1];

my @buttons = ();

my $count = scalar @{$toolbar};
for(my $i = 0; $i < $count-1; $i++) {
  next unless $toolbar->[$i];
  next if ref $toolbar->[$i];

  if(lc($toolbar->[$i]) eq 'button') {
     my $buttonobj = $toolbar->[++$i];
     # mehr code    
     my $count = scalar @{$buttonobj};
     for(my $i = 0; $i < $count; $i++) {
        next unless $buttonobj->[$i];
        next if ref $buttonobj->[$i] eq 'HASH';

        if(lc($buttonobj->[$i]) eq 'image') {
            my $imageobj = $buttonobj->[++$i];
            # mehr code
            last; # only one image
        }
     }
     # mehr code
  } elsif(lc($toolbar->[$i]) eq 'seperator') {
     my $seperatorobj = $toolbar->[++$i];
     # mehr code
  }
}

Abgesehen davon das der Code etwas spaghettihaft ist und auch keine Integritätsprüfung macht, find ich ihn auch etwas unelegant. Wie würdest du das machen? Bzw. XML Module benutz ihr?

View full thread Perl und der Kampf mit XML