xml und "&<>", Sax

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Gast

xml und "&<>", Sax

Beitragvon Gast » Samstag 4. Dezember 2004, 00:36

Hy

Wenn ich den Saxparser füttere, dann ist eigentlich alles in ordnung, ich geh passend mit Umlauten und allem um. Nur wenn eines der XML-Sonderzeichen vorkommt, dann wird es dämlich, da kommt der Parser voll aus dem Tritt und steigt aus. Na gut, dachte ich mir so naiv, dann siehst du halt zu, dass in dem XML - File diese Zeichen entsprechend escaped sind, also & mit &amp und so weiter - denkste, der Sax steigt immer noch voll aus. Also die Frage: Wie geht das, das ich diese Zeichen in den Griff bekomme?

Thanx
Aron
Benutzeravatar
Aron Squander
User
Beiträge: 21
Registriert: Donnerstag 5. Februar 2004, 16:12
Wohnort: Mainz
Kontaktdaten:

Beitragvon Aron Squander » Samstag 4. Dezember 2004, 00:37

:twisted: Mist, hat der mich doch glatt ausgelogt! Also der Gast da war ich....
Aron
The best view of ones Soul you get
from a little bit over the edge
looking back
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Samstag 4. Dezember 2004, 00:54

Hi Aron,

ein kleines Beispiel aus einem XML-File von dir, wo der Parser aussteigt währ nett. Ansonst wenn du & durch &amp;, < durch &lt; und > durch &gt; in Texten ersetzt hast sollte es gehen.


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
Aron Squander
User
Beiträge: 21
Registriert: Donnerstag 5. Februar 2004, 16:12
Wohnort: Mainz
Kontaktdaten:

Beitragvon Aron Squander » Samstag 4. Dezember 2004, 02:22

hmm
ersten fehler gefunden: man sollte auch das semikolon dazupacken, sonst nimmt er es nicht.
Ein Brocken aus dem XML-File ist:

Code: Alles auswählen

<book><author>Test1111 & Test2222</author>


der Spaß ist nur: er sollte ja dann
Test1111 & Test2222
als autor rausholen, ohne sonderzeichen tut er das auch. Jetzt liefert er nur noch Test2222, was wohl heisst, ich muss diese Fälle im Contenthandler noch abfangen, richtig? Oder passiert hier was ganz anderes?

Code: Alles auswählen

def characters(self, ch):
        if self.inBibtechType and self.inAttribute:
            self.originalRecord.setAttribute(self.currentTag, ch)

Ich denke er springt mit dem external Tag raus, womit es die Logik ziemlich zerreißt...
Aron
The best view of ones Soul you get

from a little bit over the edge

looking back
Benutzeravatar
Aron Squander
User
Beiträge: 21
Registriert: Donnerstag 5. Februar 2004, 16:12
Wohnort: Mainz
Kontaktdaten:

Beitragvon Aron Squander » Samstag 4. Dezember 2004, 09:12

Ok
Also, das encoding problem kann man mit xml.sax.saxutils lösen, da gibt es eine Funktion encode, die in einem String die XML-Metazeichen codiert und den codierten String liefert. Also kein Thema.
Der von mir gepostete Codebroken funktioniert halt nicht, man muss die Characters zwischenspeichern und erst bei dem entsprechenden Endtag rausschreiben, dann geht es. Er spring also aus der Characters Funktion bei den XML-Metazeichen raus, wenn dann aber noch etwas kommt macht er auch genau da weiter.
Thanx for the Help
Aron
The best view of ones Soul you get

from a little bit over the edge

looking back
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Samstag 4. Dezember 2004, 11:33

Hi nochmal,

ich hab selber noch nichts mit sax gemacht. Beim expat kann man ein Flag "buffer_text" angeben, damit er "Characterdata" buffert, also eben die von Entities gesplitteten Teile wieder zusammenführt bevor er die Daten an den entsprechenden Handler weiterleitet.


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
Aron Squander
User
Beiträge: 21
Registriert: Donnerstag 5. Februar 2004, 16:12
Wohnort: Mainz
Kontaktdaten:

Beitragvon Aron Squander » Samstag 4. Dezember 2004, 12:21

Der Sax hat eigetlich - zumindest langt das für das meiste - 3 routinen:
startTag
endTag
characters
Im Bezug auf XML eigentlich recht selbsterklärend. Jetzt muss man dem saxparser nur noch beibringen, was er machen soll, wenn er in eine der drei funktionen kommt. D.h. der Feed enthält ein Starttag, der Sax geht in die Starttag Funktion und führt sie aus. Von sich aus macht er nix, man muß ihm schon in die Funktion reinschreiben was zu tuen ist. Also ist die triviale Vorgehensweise einfach in StartTag Flags zu setzen, characters einfach einzulesen, und bei Endtag entscheiden, was man mit den characters macht und die entsprechenden Flags zurückzusetzt.

Cheers
Aron
The best view of ones Soul you get

from a little bit over the edge

looking back

Wer ist online?

Mitglieder in diesem Forum: egon11