From 3821bf107e91a2128369bf0a8c1e332d75519b10 Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Sat, 26 Mar 2011 15:26:45 +0000 Subject: [PATCH] Fixed namespace prefix generation for elements --- zeroinstall/injector/qdom.py | 25 +++++++++++++++++++------ zeroinstall/injector/selections.py | 6 +++--- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/zeroinstall/injector/qdom.py b/zeroinstall/injector/qdom.py index 6162227..3c997c0 100644 --- a/zeroinstall/injector/qdom.py +++ b/zeroinstall/injector/qdom.py @@ -47,14 +47,14 @@ class Element(object): @param doc: document to use to create the element @return: the new element """ - elem = doc.createElementNS(self.uri, self.name) + elem = prefixes.createElementNS(doc, self.uri, self.name) + for fullname, value in self.attrs.iteritems(): if ' ' in fullname: ns, localName = fullname.split(' ', 1) - name = prefixes.get(ns) + ':' + localName else: - ns, name = None, fullname - elem.setAttributeNS(ns, name, value) + ns, localName = None, fullname + prefixes.setAttributeNS(elem, ns, localName, value) for child in self.childNodes: elem.appendChild(child.toDOM(doc, prefixes)) if self.content: @@ -105,10 +105,11 @@ def parse(source): class Prefixes: """Keep track of namespace prefixes. Used when serialising a document. - @since: 0.51 + @since: 0.54 """ - def __init__(self): + def __init__(self, default_ns): self.prefixes = {} + self.default_ns = default_ns def get(self, ns): prefix = self.prefixes.get(ns, None) @@ -117,3 +118,15 @@ class Prefixes: prefix = 'ns%d' % len(self.prefixes) self.prefixes[ns] = prefix return prefix + + def setAttributeNS(self, elem, uri, localName, value): + if uri is None: + elem.setAttributeNS(None, localName, value) + else: + elem.setAttributeNS(uri, self.get(uri) + ':' + localName, value) + + def createElementNS(self, doc, uri, localName): + if uri == self.default_ns: + return doc.createElementNS(uri, localName) + else: + return doc.createElementNS(uri, self.get(uri) + ':' + localName) diff --git a/zeroinstall/injector/selections.py b/zeroinstall/injector/selections.py index 0dfd4a9..9bdfc72 100644 --- a/zeroinstall/injector/selections.py +++ b/zeroinstall/injector/selections.py @@ -205,7 +205,7 @@ class Selections(object): root.setAttributeNS(None, 'interface', self.interface) - prefixes = Prefixes() + prefixes = Prefixes(XMLNS_IFACE) for iface, selection in sorted(self.selections.items()): selection_elem = doc.createElementNS(XMLNS_IFACE, 'selection') @@ -215,7 +215,7 @@ class Selections(object): for name, value in selection.attrs.iteritems(): if ' ' in name: ns, localName = name.split(' ', 1) - selection_elem.setAttributeNS(ns, prefixes.get(ns) + ':' + localName, value) + prefixes.setAttributeNS(selection_elem, ns, localName, value) elif name == 'from-feed': # Don't bother writing from-feed attr if it's the same as the interface if value != selection.attrs['interface']: @@ -247,7 +247,7 @@ class Selections(object): dep_elem.setAttributeNS(None, localName, dep.metadata[m]) else: ns, localName = parts - dep_elem.setAttributeNS(ns, prefixes.get(ns) + ':' + localName, dep.metadata[m]) + prefixes.setAttributeNS(dep_elem, ns, localName, dep.metadata[m]) for b in dep.bindings: dep_elem.appendChild(b._toxml(doc)) -- 2.11.4.GIT