XML Taginhalt fehler bei Ausgabe

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.
Antworten
zimbo
User
Beiträge: 16
Registriert: Dienstag 6. Dezember 2011, 17:38

Hi
ich beschäftige mich grade mit XML für meine Thesis.
Die XML wird mit SAX ausgelesen das klappt auch alles soweit ganz gut nur hab ich bei einer bestimmten kombination im Taginhalt eine fehlerhafte Ausgabe.

Code: Alles auswählen

<vuln:reference href="https://bugzilla.redhat.com/attachment.cgi?id=473779&action=diff" 
   xml:lang="en">
https://bugzilla.redhat.com/attachment.cgi?id=473779&action=diff
</vuln:reference>
das attribut href kann ich mir ohne probleme ausgeben lassen
aber wenn ich den Inhalt ausgeben will kommen mehrere Ergebnisse

https://bugzilla.redhat.com/attachment.cgi?id=473779
https://bugzilla.redhat.com/attachment.cgi?id=473779&
https://bugzilla.redhat.com/attachment.cgi?id=473779&action=diff

d.h. sobald im Inhalt ein & Zeichen steht macht er mir ne neue Ausgaben

Code: Alles auswählen

 def startElement(self, name, attributes ):
  ...
        if name == "vuln:reference":
            self.ref_href = attributes["href"]
            self.active = name
            print("href:  ",self.ref_href)  


 def characters(self, data):

        if self.active == "vuln:reference":
            self.buffer += data
            print("vuln ref: ", self.buffer)

gibt es irgend eine Funktion oder Trick, dass ich die komplette URL bekomme?

Vielen Dank im Vorraus
deets

Es gibt bei SAX bewusst keine Garantie, dass character-events immer einen kompletten String beinhalten. Das waere auch fatal, denn damit wuerdest du jedes System einfach mit einem <root>Hier kaeme ein 16GB string</root> aus dem Tritt bringen...

Stattdessen sind es unter Umstaenden mehrere Events, und offensichtlich spaltet er die mindestens mal an Entity-Grenzen auf.

Dein Problem ist also nicht, dass du nicht alles bekommst. Sondern nur, dass du es an der falschen Stelle ausgibst. Benutze dafuer stattdessen das end-element-Event.

Last but not least: wenn du statt SAX eine vernuenftige DOM-Implementation wie ElementTree (zb auch in Form von lxml) benutzt, vermeidest du viel Aerger.
zimbo
User
Beiträge: 16
Registriert: Dienstag 6. Dezember 2011, 17:38

Ok vielen Dank für die schnelle Antwort hatte bisher einen Logikfehler drin, hab jetzt alle Sachen im endElement Block drin.
:D
Antworten