Seite 1 von 1

parsen einer xml datei mit SAX [problem]

Verfasst: Freitag 25. Juni 2004, 15:11
von NOTZE
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?

Verfasst: Samstag 26. Juni 2004, 15:14
von Milan
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

Verfasst: Samstag 26. Juni 2004, 15:23
von NOTZE
Ok danke,
da habe ich in endElement wohl etwas mist gebaut.
Aber danke für die hilfe. :D :D