HTML parsen und XML erzeugen - XML::Mini?

HTML parsen und XML erzeugen - XML::Mini?

am 21.02.2007 17:09:53 von Helmut Wollmersdorfer

Aus der ganzen Fülle von XML Modulen werde ich nicht ganz klug, und
hätte mir gern ein paar Tips geholt, welcher am einfachsten zu handhaben
ist, bzw. welcher langfristig am dankbarsten ist.

Ich geb es gerne zu: Bis jetzt habe ich HTML immer mittels Regex, 'for'
und 'if' geparst, was bei defektem, schlecht strukturiertem HTML seine
Vorteile hat.

Jetzt habe ich aber garantiert valides, strukturiertes HTML, das sich
als XML verarbeiten lässt. Nur müsste ich aus einer Table-Struktur z.B.

Oberbegriff-A:Unterbegriff-BWert

den entsprechenden Teilbaum eines XML-Formates erzeugen. Teilweise sind
die benötigten Werte aber auch in HTML-Attributen "versteckt".

Nach meiner alten, 'plain Perl' Methode müsste ich dazu XML-Teilbäume in
ein Hash beliebiger Tiefe ablegen, um es dann strukturiert auszugeben.

[Dass ich das auch unabhängig von Perl mit XSL lösen könnte, weiss ich.]

Momentan gefällt mir der Ansatz Schreiben mit XML::Mini, und Lesen der
benötigten bzw. vorhandenen Daten mit XML::XPath am besten.

Helmut Wollmersdorfer

Re: HTML parsen und XML erzeugen - XML::Mini?

am 21.02.2007 17:44:52 von Bjoern Hoehrmann

* Helmut Wollmersdorfer wrote in de.comp.lang.perl.misc:
>Jetzt habe ich aber garantiert valides, strukturiertes HTML, das sich
>als XML verarbeiten lässt. Nur müsste ich aus einer Table-Struktur z.B.

Das ist im Allgemeinen nicht möglich, es sei denn du hast nicht HTML
sondern XHTML als Eingabe (z.B., HTML erlaubt class=foo oder
ohne
End-Tag, in XML ist beides nicht erlaubt). In dem Fall solltest du die
HTML::* Module benutzen, bzw. ggf. XML::LibXML, was sowohl HTML als auch
XML verarbeiten kann.

>Oberbegriff-A:Unterbegriff-BWert
>
>den entsprechenden Teilbaum eines XML-Formates erzeugen. Teilweise sind
>die benötigten Werte aber auch in HTML-Attributen "versteckt".
>
>Nach meiner alten, 'plain Perl' Methode müsste ich dazu XML-Teilbäume in
>ein Hash beliebiger Tiefe ablegen, um es dann strukturiert auszugeben.
>
>[Dass ich das auch unabhängig von Perl mit XSL lösen könnte, weiss ich.]
>
>Momentan gefällt mir der Ansatz Schreiben mit XML::Mini, und Lesen der
>benötigten bzw. vorhandenen Daten mit XML::XPath am besten.

Naja, da kann man nicht viel zu sagen, die vielen Module haben alle ihre
Stärken und Schwächen. Du sagst ja zum Beispiel nicht ob Schnelligkeit,
Speicherverbrauch, die Wahrscheinlichkeit, dass Benutzer des Programms
die Notwendingen Module schon installiert haben, oder ähnliche Dinge
eine Rolle spielen, und das Problem ist ziemlich trivial. Ich würde in
Erwägung ziehen, das ganze als SAX-Filter zu schreiben, wenn XSLT nicht
in Frage kommt. Ich denke aber am ehesten wirst du mit XSLT glücklich.
--
Björn Höhrmann · mailto:bjoern@hoehrmann.de · http://bjoern.hoehrmann.de
Weinh. Str. 22 · Telefon: +49(0)621/4309674 · http://www.bjoernsworld.de
68309 Mannheim · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/

Re: HTML parsen und XML erzeugen - XML::Mini?

am 21.02.2007 18:09:28 von Helmut Wollmersdorfer

Bjoern Hoehrmann wrote:

> Das ist im Allgemeinen nicht möglich, es sei denn du hast nicht HTML
> sondern XHTML als Eingabe (z.B., HTML erlaubt class=foo oder
ohne
> End-Tag, in XML ist beides nicht erlaubt).

Natürlich ist es XHTML, bzw. habe ich es von HTML 4 auf XHTML
konvertiert, und die von Dir erwähnten Probleme sind ausgeräumt.
Ich dachte, das wäre klar, wenn ich schreibe "das sich als XML
verarbeiten lässt".

> Naja, da kann man nicht viel zu sagen, die vielen Module haben alle ihre
> Stärken und Schwächen. Du sagst ja zum Beispiel nicht ob Schnelligkeit,

Unter einer Minute reicht, unter 10 sec. testet es sich schneller.

> Speicherverbrauch,

Da erwarte ich nicht viel Probleme. Das Eingabe-XHTML hat 50 - 100 KB,
das resultierende XML wird davon nicht gewaltig abweichen.

> die Wahrscheinlichkeit, dass Benutzer des Programms
> die Notwendingen Module schon installiert haben,

Vorerst ein Prototyp. Die endgültige Implementierung steht nicht fest,
wird aber immer in überschaubarer Umgebung (Server) laufen.

> oder ähnliche Dinge
> eine Rolle spielen, und das Problem ist ziemlich trivial. Ich würde in
> Erwägung ziehen, das ganze als SAX-Filter zu schreiben, wenn XSLT nicht
> in Frage kommt. Ich denke aber am ehesten wirst du mit XSLT glücklich.

XSLT ist sicher beständiger. Aber mit XSLT hab ich noch zuwenig
Erfahrung. Bleibt mir in diesem Fall aber eh nicht erspart, wegen
Konvertierung in andere Zielformate.

Helmut Wollmersdorfer

Re: HTML parsen und XML erzeugen - XML::Mini?

am 21.02.2007 19:23:28 von Achim Grolms

Bjoern Hoehrmann wrote:

> Naja, da kann man nicht viel zu sagen, die vielen Module haben alle ihre
> Stärken und Schwächen. Du sagst ja zum Beispiel nicht ob Schnelligkeit,
> Speicherverbrauch, die Wahrscheinlichkeit, dass Benutzer des Programms
> die Notwendingen Module schon installiert haben, oder ähnliche Dinge
> eine Rolle spielen,

Schön, daß das Thema mal jemand anschneidet,
ich beschäftige mich auch gerade mit "Was aus CPAN
ist denn für mein XML-Problem geeignet".

Was ich brauche:

- Parser, der gegen ein gegebenes XML Schema validiert

- Das XML dient zum Datentransport, nach dem Parsen
hätte ich gerne eine Baumstruktur, an der ich
mich entlanghangeln kann um die Daten zu entnehmen
(und danach in eine Datenbank anzukippen)

- Der Parser läuft nur auf meiner Maschine, ich kann
also alles an Abhängigkeiten bereitstellen was notwendig
ist.

- Es muß keine Hochgeschwindigkeitslösung sein, das XML
wird im Cronjobbetrieb abgearbeitet.

-Speicherverbrauch... naja muß man sehen ob der
Speicher ausreicht :-D

Ins Auge gefasst habe ich XML::Xerces
(Weil da auf den Umgang mit XML Schema hingewiesen wurde).

1. Sollte ich mir andere Alternativen angucken, und welche?
2. Welche Erfahrungen habt ihr mit XML::Xerces?

Re: HTML parsen und XML erzeugen - XML::Mini?

am 21.02.2007 19:39:53 von Bjoern Hoehrmann

* Achim Grolms wrote in de.comp.lang.perl.misc:
>Was ich brauche:
>
>- Parser, der gegen ein gegebenes XML Schema validiert

Wenn das XML Schema ist, dann gibt es dafür nur ein PurePerl Modul und
XML::LibXML, beide unterstützen nur einen Teil von XML Schema, und es
wäre wenn irgend möglich anzuraten eine bessere Schemasprache zu be-
nutzen, RELAX NG zum Beispiel.

>- Das XML dient zum Datentransport, nach dem Parsen
> hätte ich gerne eine Baumstruktur, an der ich
> mich entlanghangeln kann um die Daten zu entnehmen
> (und danach in eine Datenbank anzukippen)

Das kommt dann sehr auf die Struktur an. Z.B. lassen sich viele Dinge
mit XML::Simple elegant lösen, manche Dinge aber auch gar nicht. Wenn
du eine schnelle und kompakte Baumstruktur willst, dann bist du wohl
auch am besten mit XML::LibXML dran.

>Ins Auge gefasst habe ich XML::Xerces
>(Weil da auf den Umgang mit XML Schema hingewiesen wurde).
>
>1. Sollte ich mir andere Alternativen angucken, und welche?
>2. Welche Erfahrungen habt ihr mit XML::Xerces?

Die Schema-Unterstützung in Xerces ist wohl die Beste im Kontext der
oben genannten Möglichkeiten, allerdings hab ich mit dem Modul keine
besonders guten Erfahrungen gesammelt (das ist allerdings ein paar
Jahre her, da war das nicht nennenswert entwickelt, kompilierte nicht
richtig unter Windows, und Dokumentation gabs auch nicht viel), das
könnte inzwischen besser sein.
--
Björn Höhrmann · mailto:bjoern@hoehrmann.de · http://bjoern.hoehrmann.de
Weinh. Str. 22 · Telefon: +49(0)621/4309674 · http://www.bjoernsworld.de
68309 Mannheim · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/

Re: HTML parsen und XML erzeugen - XML::Mini?

am 21.02.2007 19:57:00 von Achim Grolms

Bjoern Hoehrmann wrote:

> und es
> wäre wenn irgend möglich anzuraten eine bessere Schemasprache zu be-
> nutzen, RELAX NG zum Beispiel.

Mein Argument gegen die Verwendun von RELAX NG im
verwendeten Falle war bislang
"Ist nicht 'Industriestandard'", denn ich bekomme das XML
von vielen Verschiedenen Stellen gesendet, die Sender
sollen bitte *vor* dem Senden gegen ein Schema die
Gültigkeit des XML prüfen. Und dieses Prüfen will
ich durch die Wahl eines "Industriestandards" den Sendern
möglichst einfach machen. Eben weil XML-Schema so
verbreitet ist und von einer Vielzahl Tools unterstützt
wird habe ich XML-Schema gewählt (statt RELAX NG).
Siehst Du Schwächen in dieser Argumentation?

>>- Das XML dient zum Datentransport, nach dem Parsen
>> hätte ich gerne eine Baumstruktur, an der ich
>> mich entlanghangeln kann um die Daten zu entnehmen
>> (und danach in eine Datenbank anzukippen)
>
> Das kommt dann sehr auf die Struktur an. Z.B. lassen sich viele Dinge
> mit XML::Simple elegant lösen, manche Dinge aber auch gar nicht. Wenn
> du eine schnelle und kompakte Baumstruktur willst, dann bist du wohl
> auch am besten mit XML::LibXML dran.

Das werde ich mir anschauen!

>>Ins Auge gefasst habe ich XML::Xerces
>>(Weil da auf den Umgang mit XML Schema hingewiesen wurde).
>>
>>1. Sollte ich mir andere Alternativen angucken, und welche?
>>2. Welche Erfahrungen habt ihr mit XML::Xerces?
>
> Die Schema-Unterstützung in Xerces ist wohl die Beste im Kontext der
> oben genannten Möglichkeiten, allerdings hab ich mit dem Modul keine
> besonders guten Erfahrungen gesammelt (das ist allerdings ein paar
> Jahre her, da war das nicht nennenswert entwickelt, kompilierte nicht
> richtig unter Windows,

unter Gentoo reichte vorgestern ein
emerge dev-libs/xerces-c
mit Nachfolgender Installation des Perlwrappers
aus dem CPAN.

> und Dokumentation gabs auch nicht viel), das
> könnte inzwischen besser sein.

Ich muß wohl beide Varianten ausprobieren
und ordentliche Testdaten durchjagen.
"Wer misst misst Mist!"

Vielen Dank für die Antwort!

Re: HTML parsen und XML erzeugen - XML::Mini?

am 01.03.2007 10:45:58 von Uwe Voelker

Hallo Achim,

> - Parser, der gegen ein gegebenes XML Schema validiert

Probiere mal XML::Compile aus:
http://search.cpan.org/perldoc?XML%3A%3ACompile

Das ist zwar noch recht neu und es funktioniert noch nicht alles. Aber
es ist auch in aktiver Entwicklung und Mark Overmeer reagiert schnell
auf Mails - er kann sogar etwas Deutsch :-)

Du bekommst eine Perl-Datenstruktur zurück.


Tschüs, Uwe

--
http://www.perl-uwe.de/ - Tipps und Tricks zu Perl und CPAN-Modulen

Re: HTML parsen und XML erzeugen - XML::Mini?

am 01.03.2007 21:28:27 von Achim Grolms

Uwe Voelker wrote:
> Hallo Achim,
>
>> - Parser, der gegen ein gegebenes XML Schema validiert
>
> Probiere mal XML::Compile aus:

Die Beschreibung hört sich gut an, auch das werde
ich ausprobieren!