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

XML::Parser::parsefile durch die Struktur ...: iterieren, aber wie ?

Leser: 5


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Matze
 2006-01-30 17:29
#62458 #62458
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
So, ich bin wieder da, und habe auch gleich wieder eine Frage:
Mit XML::Parser::parsefile parse ich meine XML-Struktur, und erhalte auch ein ganz gutes Ergebniss.
Jetzt muss ich aber da durch iterieren, um die Struktur auch benutzen zu können.
Und da scheitert es dann auch schon.
Ich weiß leider nicht WIE ich durch die Komplizierte Struktur iterieren soll, da die Struktur ja auch:
1) unbegrenzt verschachtelt sein kann
2) aus Arrays, Hashes, Arrays, Hashes ... besteht

Ein kleines Beispiel:
Code (perl): (dl )
1
2
3
4
5
6
7
8
use strict;
use XML::Parser;

my $xml = XML::Parser -> new(Style => 'Tree');
my $tree = $xml->parsefile("demo.xml");

use Data::Dumper;
print Dumper($tree);


demo.xml:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
<xml>
<perl>
 print "Demo:\n";
</perl>
<window width="300" height="200" xpos="100" ypos="100">
 <title>Beispiel</title>
</window>
<perl>
 print "Ende.\n";
 exit;
</perl>
</xml>


Ausgabe:
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
$VAR1 = [
         'xml',
         [
           {},
           0,
           '
',
           'perl',
           [
             {},
             0,
             '
 print "Demo:\\n";
'
           ],
           0,
           '
',
           'window',
           [
             {
               'xpos' => '100',
               'width' => '300',
               'ypos' => '100',
               'height' => '200'
             },
             0,
             '
 ',
             'title',
             [
               {},
               0,
               'Beispiel'
             ],
             0,
             '
'
           ],
           0,
           '
',
           'perl',
           [
             {},
             0,
             '
 print "Ende.\\n";
 exit;
'
           ],
           0,
           '
'
         ]
       ];


Ich hoffe ihr könnt mir helfen.
Ich habe jetzt schon mehrere Stunden gegooglet und nichts gefunden.
Auch bei der Perl-Community ->-> Suche hab ich nichts gefunden.

MfG. Matze
Mit freundlichen Grüßen: Matze
Crian
 2006-01-30 17:51
#62459 #62459
User since
2003-08-04
5867 Artikel
ModeratorIn
[Homepage]
user image
Das Ergebnis ist eine verschachtelte Perl-Datenstruktur. Wenn du dich mit denen und der Zugriffssyntax nicht auskennst, solltest du mal das passende Kapitel im Kamelbuch (o.ä.) lesen.

zu obigem:

Code: (dl )
print $tree->[0]->[8]->[0]->{'xpos'};


(falls ich mich jetzt nicht verzählt / vertan habe)

Vielleicht bietet das Modul aber auch noch schöne Zugriffs- / Iterationsmethoden, ich kenne es leider nicht.

Falls du selbst durchiterieren willst, kannst du mit ref herausbekommen, ob du einen "normalen" Skalar oder eine Hash- oder eine Arrayreferenz vor dir hast.\n\n

<!--EDIT|Crian|1138636534-->
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
Matze
 2006-01-30 22:04
#62460 #62460
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich kenne mich mit verschachtelten Strukturen zwar aus, aber mein Problem besteht darin, das ich nicht unendlich viele Schleifen ineinander verschachteln möchte um durch die Struktur zu iterieren.
Ich dachte jemand kennt vielleicht einen guten Algorithmus mit dem das einfach geht, dazu habe ich mir auch schon Data::Dumper angesehen, und das ist ja ziemlich kompliziert.
XML::Simple kann ich leider auch nicht benutzen, da XML::Simple zwar eine bessere Struktur liefert, diese allerdings nicht mehr in der Reihenfolge vorliegt wie der Benutzer sie in der Datei festgelegt hat.

Und direkt auf Daten aus dieser Struktur zugreifen geht ja auch nicht, da dieStruktur ja nicht immer gleich ist, das oben ist nur ein kleines Beispiel gewesen.
Der Benutzer bestimmt selbst wann er welchen Tag setzen möchte und wie schon gesagt, da kann eine unbegrenzte verschachtelung vorliegen, dafür brauche ich etwas effektives.

MfG. Matze
Mit freundlichen Grüßen: Matze
ptk
 2006-01-30 23:59
#62461 #62461
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Benutze entweder XML::LibXML und XPath oder einen SAX-Parser.
renee
 2006-01-31 00:02
#62462 #62462
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich persönlich empfinde CPAN:XML::Parser als nicht sehr geegnet als Tree-Based Parser. Das Modul gehört eher in die Kategorie Event-Based. Für Dein Problem finde ich CPAN:XML::Simple, CPAN:XML::Twig oder CPAN:XML::LibXML besser.
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/
Matze
 2006-01-31 11:53
#62463 #62463
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich werde mir mal XML::LibXML ansehen.
Hab aber ne Frage zu XML::Twig, ich hab schon öfter gelesen XML::Twig wäre nur für größere XML-Dateien geeignet, da wollte ich gerne mal wissen, was genau XML::Twig mach, ob ich es auch für kleinere Dateien benutzen kann ?

MfG. Matze
Mit freundlichen Grüßen: Matze
renee
 2006-01-31 12:14
#62464 #62464
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Na klar, kannst Du das auch fuer kleinere Dateien benutzen. CPAN:XML::Twig ist eigentlich ein Tree-Based Parser (laedt also die gesamte Datei geparst in "Baumstruktur" in den Speicher). Man das Modul aber auch Event-basiert benutzen.

XML::Twig kann die Datei "chunk-by-chunk" als Stueck fuer Stueck abgrasen. Durch diese Eigenschaften eignet sich das Modul auch fuer groessere Dateien.

Hast Du Dir schon die beiden Artikel zu Wiki:XML::Twig und Wiki:XML::LibXML im Wiki gesehen??

Ich werde die morgen (australischer Zeit) nach Moeglichkeit erweitern. Ich habe naemlich gerade ein nettes Buch zu Perl und XML durch...
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/
Matze
 2006-01-31 16:30
#62465 #62465
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Also, XML::Simple und XML::LibXML finde ich nicht so passend.
XML::Simple gibt zwar(wie oben schon erwähnt) eine sehr schöne Struktur zurück, aber die Struktur ist nicht so wie der Benutzer sie in der Datei festgelegt hat, XML::Simple bearbeitet ja die Rückgabe von XML::Parser in dem es durch die Struktur iteriert, allerdings in 2 verschiedenen 'Abläufen' hintereinander die dann am Ende zu einer Tree Struktur zusammen geworfen werden, wodurch natürlich die Struktur der original Struktur nicht mehr gleicht.

XML::LibXML hab ich mir gerade im Wiki angesehen und es sieht so aus als ob es zwar gute Zugriffs-funktionen bietet aber ich brauche nicht umbedingt Zugriffsfunktionen da meine XML-Struktur verschiedene Inhalte enthalten kann, und nicht immer den selben in anderer Form.
Ausserdem weiß ich nicht ob XML::LibXML nicht auch selbst die Stuktur noch einmal 'aufbessert' um sie zwar besser zu verschachteln aber nicht mehr die original Reihenfolge beibehält.

XML::Twig interessiert mich, aber vorher noch:
Was meint ihr mit Event-basiert ?

MfG. Matze
Mit freundlichen Grüßen: Matze
ptk
 2006-01-31 23:50
#62466 #62466
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich bin mir nicht sicher, was du genau suchst. Mit XML::LibXML kannst du z.B. so vorgehen: wenn du einen Tag suchst, der sich irgendwo tief verschachtelt befindet, dann benutzt man normalerweise XPath-Konstrukte, also
Code: (dl )
$doc->findnodes("//tag")
. So bist du nicht von der "realen" Struktur abhängig. Wenn du aber die richtige Node gefunden hast, kannst du mit DOM-Methoden navigieren, also die Kinder- und Elternnodes abfragen (aber auch hier kann man weiterhin mit XPath arbeiten). XPath ist sowieso das einzig gute an XML :-)

Und: XML::LibXML "bessert" nichts auf.
renee
 2006-01-31 23:58
#62467 #62467
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Also es gibt zwei verschiedene Arten von Parsern - die Tree-basierten und die Event-basierten. Die Tree-basierten Parser parsen die Datei auf einmal und bauen dann eine Baumartige Struktur auf, durch die man sich dann hindurchnavigieren kann. Das hat den Vorteil, dass man auf alle Elemente bequem zugreifen kann und "vor und zurück" springen kann.

Event-basierte Parser gehen Zeilenweise/Stückchenweise durch und werfen verschiedene "Events". Man muss sich selbst um die Behandlung dieser Events kümmern.

Betrachten wir mal folgendes Beispiel:
Code: (dl )
1
2
3
4
5
<foren>
<nr value="1">
http://board.perl-community.de
</nr>
</foren>


Bei Event-basierten Parsern gibt es Events für "Anfang des Dokuments" - wenn also noch gar nichts geparst ist.
Start des Tags ist ein weiteres Event, wenn der Parser z.B. auf <foren> trifft. Und einen End-Event gibt es, wenn der Parser auf das schliessende Tag stoesst.

Dafuer legt man dann bei CPAN:XML::Twig die start_tag_handlers (oder andere Handler) für die verschiedenen Tags an...
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/
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2006-01-30 17:29.