]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Patch #432117: Record namespaces in the DOM tree using the DOM xmlns prefix.
authorMartin v. Löwis <martin@v.loewis.de>
Wed, 18 Jul 2001 15:30:25 +0000 (15:30 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Wed, 18 Jul 2001 15:30:25 +0000 (15:30 +0000)
Lib/xml/dom/pulldom.py

index d71f6dfcb304c5c7e3e10c5e25fb01850a388a60..c12c992a6856722e93aefc311d77c20eda63debe 100644 (file)
@@ -44,6 +44,9 @@ class PullDOM(xml.sax.ContentHandler):
         self._locator = locator
 
     def startPrefixMapping(self, prefix, uri):
+        if not hasattr(self, '_xmlns_attrs'):
+            self._xmlns_attrs = []
+        self._xmlns_attrs.append((prefix or 'xmlns', uri))
         self._ns_contexts.append(self._current_context.copy())
         self._current_context[uri] = prefix or ''
 
@@ -51,6 +54,13 @@ class PullDOM(xml.sax.ContentHandler):
         self._current_context = self._ns_contexts.pop()
 
     def startElementNS(self, name, tagName , attrs):
+        # Retrieve xml namespace declaration attributes.
+        xmlns_uri = 'http://www.w3.org/2000/xmlns/'
+        xmlns_attrs = getattr(self, '_xmlns_attrs', None)
+        if xmlns_attrs is not None:
+            for aname, value in xmlns_attrs:
+                attrs._attrs[(xmlns_uri, aname)] = value
+            self._xmlns_attrs = []
         uri, localname = name
         if uri:
             # When using namespaces, the reader may or may not
@@ -76,7 +86,14 @@ class PullDOM(xml.sax.ContentHandler):
 
         for aname,value in attrs.items():
             a_uri, a_localname = aname
-            if a_uri:
+            if a_uri == xmlns_uri:
+                if a_localname == 'xmlns':
+                    qname = a_localname
+                else:
+                    qname = 'xmlns:' + a_localname
+                attr = self.document.createAttributeNS(a_uri, qname)
+                node.setAttributeNodeNS(attr)
+            elif a_uri:
                 prefix = self._current_context[a_uri]
                 if prefix:
                     qname = prefix + ":" + a_localname