[XML-SIG] Re: Getting namespace aware parser to work...
Clark C. Evans
cce@clarkevans.com
Mon, 19 Mar 2001 06:07:10 -0500 (EST)
I believe the problem is default namespaces that
do not have a prefix. The stripper gives the
expected (and, of course incorrect as it's not finished)
output when the test.xml file is changed to:
<test>
<strip:one xmlns:strip="baduri">one</strip:one>
<two>keep</two>
</test>
So... does the namespace aware code handle the case
when a namespace is not in the lookup table?
Clark
On Mon, 19 Mar 2001, Clark C. Evans wrote:
> Date: Mon, 19 Mar 2001 06:03:37 -0500 (EST)
> From: Clark C. Evans <cce@clarkevans.com>
> To: xml-sig@python.org
> Subject: Getting namespace aware parser to work...
>
> I'm trying to process the following xml file, with
> this python script to strip all elements with a
> given namespace. I believe that I have a pretty
> recent version (0.5.2). I get the error following...
>
> -----------------------------------------------------------------
> test.xml
> -----------------------------------------------------------------
>
> <test>
> <one xmlns="baduri">strip</one>
> <two>keep</two>
> </test>
>
> -----------------------------------------------------------------
> test.py
> -----------------------------------------------------------------
>
> """Strips a particular namespace from an XML document."""
> from xml.sax import saxutils
>
> class StripperFilter(saxutils.XMLFilterBase ):
> """Does the actual stripping"""
> def __init__(self,nmsp):
> """The namespace to strip is nmsp"""
> saxutils.XMLFilterBase.__init__(self)
> self.nmsp = nmsp
>
> def startElementNS(self, name, qname, attrs):
> """Ignores elements and strips attributes of nmsp"""
> if name[0] != self.nmsp:
> #
> # Warning: For efficiency this dives into the
> # underlying representation of AttributesNSImpl
> # and deletes attributes to be stripped.
> #
> # _attrs should be of the form {(ns_uri, lname): value, ...}.
> # _qnames of the form {(ns_uri, lname): qname, ...}."""
> #
> for (ns_uri,lname) in attrs._attrs.keys():
> if nmsp == ns_uri: del attrs._attrs[(ns_uri,lname)]
> saxutils.XMLFilterBase.startElementNS(self,name,qname,attrs)
>
>
> from xml.sax import make_parser
> from xml.sax.handler import feature_namespaces
>
> def testStripper():
> parser = make_parser()
> parser.setFeature(feature_namespaces, 1)
> strip = StripperFilter('myuri')
> out = saxutils.XMLGenerator()
> strip.setContentHandler(out)
> parser.setContentHandler(strip)
> parser.parse("c:\\work\\xfld\\test.xml")
>
> if __name__ == '__main__':
> testStripper()
>
> ----------------------------------------------------------------------
> The error message
> ----------------------------------------------------------------------
> <?xml version="1.0" encoding="iso-8859-1"?>
> <test>
> stripTraceback (most recent call last):
> File "<stdin>", line 40, in ?
> File "<stdin>", line 37, in testStripper
> File "F:\Program Files\Python\_xmlplus\sax\expatreader.py", line 43, in
> parse
> xmlreader.IncrementalParser.parse(self, source)
> File "F:\Program Files\Python\_xmlplus\sax\xmlreader.py", line 120, in
> parse
> self.feed(buffer)
> File "F:\Program Files\Python\_xmlplus\sax\expatreader.py", line 87, in
> feed
> self._parser.Parse(data, isFinal)
> File "F:\Program Files\Python\_xmlplus\sax\expatreader.py", line 187, in
> end_element_ns
> self._cont_handler.endElementNS(pair, None)
> File "F:\Program Files\Python\_xmlplus\sax\saxutils.py", line 259, in
> endElementNS
> self._cont_handler.endElementNS(name, qname)
> File "F:\Program Files\Python\_xmlplus\sax\saxutils.py", line 192, in
> endElementNS
> qname = self._current_context[name[0]] + ":" + name[1]
> TypeError: bad operand type(s) for +
>
>
>
>
>
>
>
>
>
>