By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,629 Members | 1,222 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,629 IT Pros & Developers. It's quick & easy.

setDocumentLocator in validating parser (xmlproc)

P: n/a
Hi,

it seems that xmlproc, the default Validating parser, in my setup does
not call back to setDocumentLocator. Is there anyway to get a locator
in my handler?
Below you find an example and its output.

Regards, Cees

# base imports
from xml.sax.handler import ContentHandler
from xml.sax.handler import EntityResolver
import xml.sax
import xml.sax.sax2exts

class BaseHandler(ContentHandler):
def setDocumentLocator(self,locator):
print "setDocumentLocator called"
self.d_locator=locator

def startElement(self, name, attr):
print "startElement", name
open('e.dtd','w').write('<!ELEMENT E EMPTY>')
open('e.xml','w').write(
"""<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE E SYSTEM "e.dtd"><E/>""")

vp = xml.sax.sax2exts.XMLValParserFactory.make_parser()
print "vp type", vp.__class__
vph = BaseHandler()
vp.setContentHandler(vph)
vp.parse("e.xml")

np = xml.sax.make_parser()
print "np type", np.__class__
nph = BaseHandler()
np.setContentHandler(nph)
np.parse("e.xml")

OUTPUT:
vp type xml.sax.drivers2.drv_xmlproc.XmlprocDriver
startElement E
np type xml.sax.expatreader.ExpatParser
setDocumentLocator called
startElement E
Jul 18 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
"Cees Wesseling" <ce**@pcraster.nl> wrote in message
news:6b**************************@posting.google.c om...
it seems that xmlproc, the default Validating parser, in my setup does
not call back to setDocumentLocator. Is there anyway to get a locator
in my handler?


It's a known bug with a simple patch -- I don't know why it wasn't fixed in
PyXML 0.8.4.
http://sourceforge.net/tracker/?func...73&atid=106473

I had the same problem a while ago; I ended up doing a monkeypatch to
xml.sax.drivers2.drv_xmlproc to add the missing call:

import xml.sax.drivers2.drv_xmlproc

# Override the set_locator method.
def set_locator(self, locator):
# Existing code.
self._locator = locator
# ...but also call the ContentHandler.
# drv_xmlproc already implements the Locator interface.
self._cont_handler.setDocumentLocator(self)

setattr(xml.sax.drivers2.drv_xmlproc.XmlprocDriver , "set_locator",
set_locator)

HTH,

James Kew
http://jameskew.blogspot.com
Jul 18 '05 #2

P: n/a
"James Kew" <ja*******@gmail.com> wrote in message news:<d1**********@news.astound.net>...

Thanks James, a perfect patch that works perfect for me.

On a side note, it seems the locator is not standarized. expat gives
positions at the "<"-char of startElement while xmlproc (PyXml) gives
it the ">"-char of startElement.And both one columnNumber off. A bit
annoying when swapping parsers.

Cees
Jul 18 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.