[python-win32] Using msxml SAX via win32com -- how do I implementan ISAXContentHandler in Python?

Jesse Davis jdavis at wgen.net
Mon Mar 14 19:46:45 CET 2005


Hey, gurus. I've worked a bit on this problem & come up with a more
fundamental question:

Can COM objects created by win32com.client support QueryInterface for
interfaces OTHER THAN IUnknown, IDispatch, & other builtins?

In my experiments, the QI fails for IID's other than these builtins,
whether I'm QIing a Python COM object or an msxml object.

I need to instantiate an ISAXXMLReader from msxml, & set its
'contentHandler' to a COM object I've implemented in Python. Since
reader.contentHandler = myCOMObj returns a type mismatch from COM, I
assume the reader QI's myCOMObj from ISAXXMLContentHandler & fails.

________________________________

From: python-win32-bounces at python.org
[mailto:python-win32-bounces at python.org] On Behalf Of Jesse Davis
Sent: Thursday, March 10, 2005 4:41 PM
To: python-win32 at python.org
Subject: [python-win32] Using msxml SAX via win32com -- how do I
implementan ISAXContentHandler in Python?



Greetings, gurus, & salutations, swamis. 

Summary:  Trying to use msxml's SAXXMLReader.  I've implemented an
ISAXContentHandler in Python (see end of post), registered it using
win32com.server.register.UseCommandLine(), & then I do:

>>> import win32com.client as w32c 
>>> h = w32c.Dispatch('Python.SyncMLBenchmarkSAXContentHandler') 
>>> h 
<COMObject Python.SyncMLBenchmarkSAXContentHandler> 
>>> h.characters('foobar') 
characters 

So this shows I've registered my content-handler, I can instantiate it,
& when I call its characters() method, it prints 'characters' like I
expected.  Next, I run makepy on Msxml2.SAXXMLReader, & I try to
register the content-handler with the reader.  Here's the problem:

>>> r = w32c.Dispatch('Msxml2.SAXXMLReader') 
>>> r 
<win32com.gen_py.Microsoft XML, v5.0.IVBSAXXMLReader instance at
0x46177544> 
>>> r.contentHandler = h 
Traceback (most recent call last): 
  File "<interactive input>", line 1, in ? 
  File "C:\Python22\Lib\site-packages\win32com\client\__init__.py", line
463, in __setattr__ 
    self._oleobj_.Invoke(*(args + (value,) + defArgs)) 
com_error: (-2147352571, 'Type mismatch.', None, 2) 
>>> r.putContentHandler(h) 
Traceback (most recent call last): 
  File "<interactive input>", line 1, in ? 
  File "C:\Python22\Lib\site-packages\win32com\client\__init__.py", line
454, in __getattr__ 
    raise AttributeError, "'%s' object has no attribute '%s'" %
(repr(self), attr) 
AttributeError: '<win32com.gen_py.Microsoft XML, v5.0.IVBSAXXMLReader
instance at 0x46177544>' object has no attribute 'putContentHandler'

Maybe I need to run makepy on my Python.SyncMLBenchmarkSAXContentHandle
CoClass, but it doesn't show up in PythonWin's makepy GUI.  Similarly,
"python makepy.py Python.SyncMLBenchmarkSAXContentHandler" & "python
makepy.py SyncMLBenchmarkSAXContentHandler" respond "Could not locate a
type library matching..."  However, there are reg keys
HKEY_CLASSES_ROOT\CLSID\{85DBFCAE-7AEC-4c26-A165-7B91337ED934} &
HKEY_CLASSES_ROOT\Python.SyncMLBenchmarkSAXContentHandler.

Any ideas? 
Jesse Davis 

=======SyncMLBenchmarkSAXContentHandler===== 
class SyncMLBenchmarkSAXContentHandler: 

    _public_methods_ = ['characters', 'endDocument', 'endElement',
'endPrefixMapping', 
                        'ignorableWhitespace', 'processingInstruction',
'skippedEntity', 
                        'startDocument', 'startElement',
'startPrefixMapping' ] 
    _reg_progid_ = 'Python.SyncMLBenchmarkSAXContentHandler' 
    _reg_clsid_ = '{85DBFCAE-7AEC-4c26-A165-7B91337ED934}' 

    def characters(self, strChars=None): 
        print 'characters' 
    def endDocument(self): 
        print 'endDocument' 
    def endElement(self, strNamespaceURI=None, strLocalName=None,
strQName=None): 
        print 'endElement' 
    def endPrefixMapping(self, strPrefix=None): 
        print 'endPrefixMapping' 
    def ignorableWhitespace(self, strChars=None): 
        print 'ignorableWhitespace' 
    def processingInstruction(self, strTarget=None, strData=None): 
        print 'processingInstruction' 
    def skippedEntity(self, strName=None): 
        print 'skippedEntity' 
    def startDocument(self): 
        print 'startDocument' 
    def startElement(self, strNamespaceURI=None, strLocalName=None,
strQName=None, oAttributes=None): 
        print 'startElement' 
    def startPrefixMapping(self, strPrefix=None, strURI=None): 
        print 'startPrefixMapping' 




More information about the Python-win32 mailing list