Schrift
[thread]6783[/thread]

Perl und der Kampf mit XML



<< |< 1 2 3 >| >> 28 Einträge, 3 Seiten
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?
esskar
 2005-03-11 19:08
#52572 #52572
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Hab gerade XML-Parser-EasyTree entdeckt;
sieht gut aus;
nichts desto trotz interessieren mich eure Meinungen!
ptk
 2005-03-11 19:45
#52573 #52573
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich glaube, ich werde mit XML::LibXML gluecklich werden. Gut finde ich, dass man XPATH verwenden kann, meiner Meinung das einzig Gute bei XML. Ein kleines Codebeispiel:
Code: (dl )
1
2
3
4
5
    use XML::LibXML;
my $xml = XML::LibXML->new;
my $doc = $xml->parse_string($xml_content);
my $doc_elem = $doc->documentElement;
my $value = $doc_elem->findvalue("/path/to/element");
jan
 2005-03-12 01:46
#52574 #52574
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich persönlich mag HTML::TreeBuilder und dementsprechen auch XML::TreeBuilder. habe allerdings nun keine tollen argumente dafür, aber es ist angenehm zu benutzen, lässt komplexe suchmuster mit look_down zu und ist in ansätzen performant.
sri
 2005-03-12 03:27
#52575 #52575
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
esskar
 2005-03-12 21:39
#52576 #52576
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=sri,12.03.2005, 02:27]YAML++[/quote]
toll; einfach mal das Beispiel ausgeführt

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
C:\Dokumente und Einstellungen\sak>perl
use YAML;
my ($hashref, $arrayref, $string) = Load(<<'--END');
---
name: ingy
age: old
weight: heavy
# I should comment that I also like pink, but don't tell anybody.
favorite colors:
- red
- white
- blue
---
- clark
- oren
- ingy
--- ]
You probably think YAML stands for "Yet Another Markup Language". It
ain't! YAML is really a data serialization language. But if you want
to think of it as a markup, that's OK with me. A lot of people try
to use XML as a serialization format.
"YAML" is catchy and fun to say. Try it. "YAML, YAML, YAML!!!"
--END
print Store($string, $arrayref, $hashref);
use Data::Dumper;
print Dumper($string, $arrayref, $hashref);
^Z
--- !perl/YAML::Error
code: YAML_PARSE_ERR_INCONSISTENT_INDENTATION
msg: Inconsistent indentation level
line: 15
document: 3
...
at - line 2


Macht aber nix; ich will ja xml. :)
pq
 2005-03-13 14:25
#52577 #52577
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
@esskar: du hast ja auch das beispiel falsch ausgeführt. du hast ein paar
whitespaces vergessen.
du kannst ja auch nicht bei XML ein paar <...> vergessen und XML::Parser
dafür verantwortlich machen, wenn es einen fehler gibt.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
mordur
 2005-03-14 09:43
#52578 #52578
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
XML:Parser und XML:Checker und XML:Dom hab ich im Zusammenspiel benutzt und war sehr zufrieden. Mit dem Checker kann man anhand einer DTD-Datei Prüfungen anstellen etc. Mit Dom auf einzelne Elemente zugreifen und schreiben etc.
esskar
 2005-03-14 15:27
#52579 #52579
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
at pq; das war die darstellung hier im forum; ich hab drauf geachtet, dass das beispiel so aussieht wie im POD (das ich jedoch von der html version kopiert habe)!
ptk
 2005-03-14 18:32
#52580 #52580
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Das Problem ist, das fuehrender Whitespace bei YAML signifikant ist, aber die meisten Pod-Renderer zusaetzlichen Whitespace am Anfang der Zeile einfuegen (und dass man ueberhaupt fuer die Darstellung von preformatierten Text mindestens ein Space braucht).
<< |< 1 2 3 >| >> 28 Einträge, 3 Seiten



View all threads created 2005-03-11 19:00.