Help with XML-SAX program ... it's driving me nuts ...

mitsura at skynet.be mitsura at skynet.be
Tue Jan 31 07:41:43 EST 2006


Hi,

I need to read a simle XML file. For this I use the SAX parser. So far
so good.
The XML file consist out of number of "Service" object with each object
a set of attributes.

I read through the XML file and for each "<Service>" entry I create a
new service object.
When I am in the "<Service>" part of the XML file and I encounter
"<Attributes>" then I store these attributes into a Python dictionary.
At the end of the "</Service>" tag I create the actual object and pass
the attributes directory to it.
The strange thing is that for some reason, the attributes for all the
objects are being updated. I don't understand why this happens.

I included the code and a example of the XML file (kd.xml)
The output should be:
Obj:  name2 attribs:  {}
Obj:  name attribs:  {attrib1, val1, atttrib1.1, val1.1}
Obj:  name1 attribs:  {attrib2, val 2}

but it is:
Obj:  name2 attribs:  {}
Obj:  name attribs:  {}
Obj:  name1 attribs:  {}

It's driving me nuts. I have spend hours going through this very simple
code, but I can't find what's wrong.
Any help is really very much appreciated.

With kind regards,

Kris
XML File (kd.xml):
"
<?xml version='1.0' ?>
<Services>
  <Service>
    <Name>name</Name>
    <Label>label</Label>
    <Icon>/opt/OV/www/htdocs/ito_op/images/service.32.gif</Icon>
    <Status>
      <Normal/>
    </Status>
    <Depth>1</Depth>
    <Attribute>
     <Name>Attrib1</Name>
     <Value>Val1</Value>
    </Attribute>
    <Attribute>
     <Name>Attrib1.1</Name>
     <Value>Val1.1</Value>
    </Attribute>
  </Service>
  <Service>
    <Name>name1</Name>
    <Label>label1</Label>
    <Icon>/opt/OV/www/htdocs/ito_op/images/service.32.gif</Icon>
    <Status>
      <Normal/>
    </Status>
    <Depth>1</Depth>
    <Attribute>
     <Name>Attrib2</Name>
     <Value>val 2</Value>
    </Attribute>
  </Service>
  <Service>
    <Name>name2</Name>
    <Label>label2</Label>
    <Icon>/opt/OV/www/htdocs/ito_op/images/service.32.gif</Icon>
    <Status>
      <Normal/>
    </Status>
    <Depth>1</Depth>
  </Service>
</Services>
"
Program:
"
import  sys
import  string
import  images
import  os
import  cStringIO
import  xml.sax


from wxPython.wx import *
from Main import opj
from xml.sax.handler import *
from xml.sax import make_parser

class ServiceObj:

	def __init__(self,name):

		# Serivce object properties
		self.name = name
		self.attributes = {}

class OpenSNXML(ContentHandler):

	# Service Object Tags
	inService     		= 0
	inServiceAttribute 	= 0
	inServiceName 		= 0
	inAttributeName 	= 0
	inAttributeValue 	= 0


	objName			= ""
	objLabel		= ""

	attribs			= {}
	attribName		= ""
	attribValue		= ""

	def startElement(self, name, attrs):

		if name == "Service":
			self.inService = 1

		if self.inService == 1:
			if name == "Attribute":
				print "Attribute start"
				self.inServiceAttribute = 1

			if name == "Name" and ( self.inServiceAttribute == 0 ):
				self.inServiceName = 1

			if name == "Name" and (self.inServiceAttribute == 1):
				self.inAttributeName = 1

			if name == "Value" and (self.inServiceAttribute == 1):
				self.inAttributeValue = 1

	def characters(self, characters):
		if self.inServiceName == 1:
			self.objName = self.objName + characters

		if self.inAttributeName == 1:
			#print "Attribute Name: ", characters
			self.attribName = self.attribName + characters

		if self.inAttributeValue == 1:
			#print "Attribute Value: ", characters
			self.attribValue = self.attribValue + characters

	def endElement(self, name):
		mD = 1

		if name == "Service":

			self.inService = 0

			# If the object already exists, update the existing object
			if AllServiceObjectsFromXMLFile.has_key(self.objName):
				#print "Object: ", self.objName, " already defined in exists in
dir"
				obj = AllServiceObjectsFromXMLFile[self.objName]
			else:
				obj = ServiceObj(self.objName)

			obj.attributes = self.attribs

			AllServiceObjectsFromXMLFile[self.objName] = obj

			del obj

			self.objName = ""
			self.attribs.clear()

		if name == "Attribute":
			self.inServiceAttribute = 0
			print "Attrib name: ", self.attribName
			print "Attrib value: ", self.attribValue

			self.attribs[self.attribName] = self.attribValue
			self.attribName = ""
			self.attribValue = ""

			print "Attrib dir: ", self.attribs
			print "Attribute stop"

		if name == "Name":
			self.inServiceName = 0
			self.inAttributeName = 0

		if name == "Value":
			self.inAttributeValue = 0


# Main
AllServiceObjectsFromXMLFile = {}

GetAllObjectsFromXMLfilePS = xml.sax.make_parser()
GetAllObjectsFromXMLfileHD = OpenSNXML()
GetAllObjectsFromXMLfilePS.setContentHandler(GetAllObjectsFromXMLfileHD)
GetAllObjectsFromXMLfilePS.parse("kd.xml")

keys = AllServiceObjectsFromXMLFile.keys()

for key in keys:
	obj = AllServiceObjectsFromXMLFile[key]
	print "Obj: ", obj.name, "attribs: ", obj.attributes
"




More information about the Python-list mailing list