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

Teil einer XML-Datei in Hash rein



<< >> 6 Einträge, 1 Seite
Superfrank
 2006-11-28 14:27
#72030 #72030
User since
2006-09-05
164 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich versuche gerade eine XML-Datei in einen Hash zu parsen, dabei benötige ich nur einen Teil des Dokumentes und weiß nicht welche Schlüssel vorhanden sind. Ich habe schon diverse Module zum XML-Parsen entdeckt aber das ist ja alles unglaublich kompliziert!

Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
           <adresse>
<contact:type>Firma</contact:type>
<contact:name>Supidipi GmbH</contact:name>
<contact:postal>
<contact:address>zuhausestrasse 1</contact:address>
<contact:postalCode>12345</contact:postalCode>
<contact:city>Bad Meingarten</contact:city>
<contact:countryCode>DE</contact:countryCode>
</contact:postal>
<contact:phone>+49 12345</contact:phone>
<contact:fax>+49 23456</contact:fax>
<contact:email>info@example.com</contact:email>
</adresse>


Das soll einfach nur in einen Hash rein. Ich habe schon content_list(), all_attr_names() versucht aber irgendwie kriege ich es nicht hin.
Zum Parsen probiere ich z.Z. CPAN:XML::TreeBuilder mit den edthoden aus CPAN:HTML::Element.

Eigentlich soll XML ja das Leben vereinfachen, merke ich aber noch nicht viel von.


Grüsse

Frank
renee
 2006-11-28 15:25
#72031 #72031
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wie legst Du dann fest, welchen Teil des Dokuments Du brauchst?

Mit CPAN:XML::Simple ist das Parsen sehr einfach, parst aber immer automatisch das gesamte Dokument.

Ansonsten kann ich Dir CPAN:XML::Twig empfehlen.
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/
Superfrank
 2006-11-28 16:05
#72032 #72032
User since
2006-09-05
164 Artikel
BenutzerIn
[default_avatar]
Hallo Renee,
mit CPAN:XML::Simple kriege ich die einzelnen Werte, allerdings sieht das in meinem Programm wegen der übelst langen Zeile dann äußerst unschön aus. Und es sind nicht unbedingt alle Zeilen da, z.B. email und Fax gibt es nicht immer. Daher wolle ich eleganterweise erst einmal fesstellen was überhaupt vorhanden ist, aber content_list() gibt nur sowas wie

XML::Element=HASH(0x84cce2c)
XML::Element=HASH(0x84d80bc)
XML::Element=HASH(0x84d8128)
.
.
.

zurück und es fragt sich wie es damit weitergehen soll.

Grüsse

Frank
renee
 2006-11-28 16:16
#72033 #72033
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dann musst Du mit $xml_element_obj->content() an den Inhalt des CPAN:XML::Elements kommen.
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/
ptk
 2006-11-28 22:28
#72034 #72034
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ist das die vollständige XML-Datei? Sie scheint nicht korrekt zu sein:
Code: (dl )
1
2
3
4
5
6
7
8
$ xmllint -
-:2: namespace error : Namespace prefix contact on type is not defined
<contact:type>Firma</contact:type>
^
-:3: namespace error : Namespace prefix contact on name is not defined
<contact:name>Supidipi GmbH</contact:name>
^
...


Ansonsten hätte ich gesagt: nimm CPAN:XML::LibXML, aber wenn hier tatsächlich Namespaces vorkommen, dann wird es damit etwas haariger.
Superfrank
 2006-11-29 11:47
#72035 #72035
User since
2006-09-05
164 Artikel
BenutzerIn
[default_avatar]
Hallo,
erstmal vielen Dank für Eure Hilfe!
Der Ausschnitt war nicht die vollständige xml-Datei, die ist etwas größer und kann mehrere Kontakte unterschiedlichen Typs beinhalten.
Ich bin jetzt doch bei CPAN:XML::TreeBuilder geblieben und suche die einzelnen Kontakte mit

Code: (dl )
1
2
3
foreach my $contacts ($tree->find_by_tag_name('contact'){
my $name = $contacts->find_by_tag_name('contact:name')->as_text;
}


raus. Werte die nicht unbeding vorhanden sind ziehe ich mit

Code: (dl )
$contacts->find_by_tag_name('contact:fax');


erstmal ohne "->as_text" da sonst eine Fehlermeldung

"Can't call method "as_text" on an undefined value at..."

kommt. Aber so komme ich erstmal klar.

Grüsse

Frank
<< >> 6 Einträge, 1 Seite



View all threads created 2006-11-28 14:27.