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
"

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to