how to use xml.sax

besty2000 at hotmail.com besty2000 at hotmail.com
Mon Nov 20 11:56:07 EST 2000


I have upgraded to using Python2.0 from 1.5.2 and I am now having 
difficulty parsing my XML files using the xml.sax module.

I have been refering to the XML HOWTo and the Python2.0 notes
but get the following error:-  

File "C:\My Documents\Python\NCFM\CommandValidation.py", line 49, in 
loadCommandDict
    p.parse(self.commandFile)
  File "c:\python20\lib\xml\sax\expatreader.py", line 42, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "c:\python20\lib\xml\sax\xmlreader.py", line 120, in parse
    self.feed(buffer)
  File "c:\python20\lib\xml\sax\expatreader.py", line 81, in feed
    self._parser.Parse(data, isFinal)
TypeError: not enough arguments; expected 4, got 2 

The code I have been using is as follows:-

from xml.sax import make_parser
from xml.sax.handler import ContentHandler, feature_namespaces

p = make_parser()
p.setFeature(feature_namespaces, 0)
dh = CommandParser(self)
p.setContentHandler(dh)
p.parse(self.commandFile)
p.close()

class CommandParser(ContentHandler):
    def __init__(self, instance):
        self.instance = instance
        
        self.in_NFCM = 0
        self.in_Command = 0
        self.in_Name = 0
        self.in_Syntax = 0
        self.command = ''
        self.syntax = ''
                    
    def startElement(self, name , attrs):

        if name == 'NCFM':
            self.in_NCFM = 1

        elif name == 'Command' and self.in_NCFM:            
            self.in_Command = 1
                        
        elif name == 'Name' and self.in_Command:
            self.in_Name = 1

        elif name == 'Syntax' and self.in_Command:
            self.in_Syntax = 1
            
    def endElement(self, name):

        if name == 'NCFM':
            self.in_NCFM = 0

        elif name == 'Command' and self.in_NCFM:
            self.instance.addCommand(self.command,self.syntax)
            self.in_Command = 0
            self.command = ''
            self.syntax = ''
                        
        elif name == 'Name' and self.in_Command:
            self.in_Name = 0

        elif name == 'Syntax' and self.in_Command:
            self.in_Syntax = 0

        
    def characters(self, ch, start, length):
        if self.in_Name:
            self.command = self.command + ch[start:start+length]

        if self.in_Syntax:
            self.syntax = self.syntax + ch[start:start+length]


Should I be using the default expat parser?

Can anyone help?








More information about the Python-list mailing list