[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 +
> 
> 
> 
> 
> 
> 
> 
> 
> 
>