parsen einer xml datei mit SAX [problem]

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
NOTZE
User
Beiträge: 106
Registriert: Mittwoch 21. Januar 2004, 20:28

Hi,
ich habe mich jetzt mal versucht in SAX einzuarbeiten.
Nun versuchte ich eine art telefonliste zu parsen.
Also hier der python code:

Code: Alles auswählen

#! /usr/bin/python

from xml.sax import ContentHandler
import xml.sax

class phoneHandler(ContentHandler):
	def __init__(self):
		self.number = ""
		self.town = ""
		self.name = ""
		self.mapping = {}
		self.isTown = 0
		self.isNumber = 0
		self.index = -1
		
	def startElement(self, name, attributes):
		if name == "pupil":
			self.name = attributes["name"]
		elif name == "number":
			self.isNumber=1
			self.number =""
		elif name == "town":
			self.isTown=1
			self.town = ""
			
	def characters(self, data):
		if self.isNumber:
			self.number+= data
		if self.isTown:
			self.town += data
			
	def endElement(self,name):
		#if self.index == 0:
		self.index += 1		
		if name == "number":
			self.isNumber = 0
		elif name == "town":
			self.isTown = 0
		self.mapping[self.index] = self.name
		

parser =xml.sax.make_parser()
handler = phoneHandler()
parser.setContentHandler(handler)
parser.parse("test.xml")

for i in range (len(handler.mapping)):
	print handler.mapping[i]
die xml datei:

Code: Alles auswählen

<phonelist>
	<pupil name="Daniel Martin">
		<number>05603/6512</number>
		<town>WO anders als ihr</town>
	</pupil>
	<pupil name="Hans-Peter, Olm">
		<number>05624/8441</number>
		<town>Bad Emstal Sand</town>
	</pupil>
	<pupil name="Dooofy, Range">
		<number>05624/1340</number>
		<town>Bad Emstal Sand</town>
	</pupil>
</phonelist>
aber wenn ich das nun so starte bekomme ich folgende ausgabe:

Code: Alles auswählen

Daniel Martin
Daniel Martin
Daniel Martin
Hans-Peter, Olm
Hans-Peter, Olm
Hans-Peter, Olm
Dooofy, Range
Dooofy, Range
Dooofy, Range
Dooofy, Range
Habe ich einen fehler im setzen der flags oder was?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Dein endElement ist ein wenig missglückt. Zum Beispiel sollten die Daten ja eigentlich gespeichert werden, wenn ein pupil Tag zuende ist. Vorher wurden sie ja in self.town etc zwischengespeichert. Ich glaube, dass wird am besten am Beispiel deutlich, hier mal meine Version:

Code: Alles auswählen

    def endElement(self,name):
        if name=="pupil":
            self.index+=1
            self.mapping[self.index]=(self.name,self.number,self.town)
        elif name == "number": 
            self.isNumber = 0 
        elif name == "town": 
            self.isTown = 0
Danke aber, dass du so ausführlich gepostet hast. Das hats mir ermöglicht, mich auch mal schnell in SAX einzuarbeiten. :D
NOTZE
User
Beiträge: 106
Registriert: Mittwoch 21. Januar 2004, 20:28

Ok danke,
da habe ich in endElement wohl etwas mist gebaut.
Aber danke für die hilfe. :D :D
Antworten