I'm trying to create shibboleth configuration files using xml.etree in python, and I'm having problems with it omitting namespace assignments when it output the finished document. I'm pretty sure that it's the problem described in Outputting an “unused” XML namespace using ElementTree
I declare them...
namespaces = {
'resolver': 'urn:mace:shibboleth:2.0:resolver',
'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
'pc': 'urn:mace:shibboleth:2.0:resolver:pc',
'ad': 'urn:mace:shibboleth:2.0:resolver:ad',
'dc': 'urn:mace:shibboleth:2.0:resolver:dc',
'enc': 'urn:mace:shibboleth:2.0:attribute:encoder',
'sec': 'urn:mace:shibboleth:2.0:security',
}
for prefix, uri in namespaces.iteritems():
ET.register_namespace(prefix, uri)
If I print out the namespaces that have been defined for the document...
print json.dumps( ET._namespace_map, indent=True )
I see my namespaces there..
{
"urn:mace:shibboleth:2.0:resolver:pc": "pc",
"http://schemas.xmlsoap.org/wsdl/": "wsdl",
"urn:mace:shibboleth:2.0:resolver:ad": "ad",
"urn:mace:shibboleth:2.0:resolver": "resolver",
"http://www.w3.org/1999/xhtml": "html",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf",
"urn:mace:shibboleth:2.0:security": "sec",
"urn:mace:shibboleth:2.0:attribute:encoder": "enc",
"http://www.w3.org/2001/XMLSchema": "xs",
"http://www.w3.org/2001/XMLSchema-instance": "xsi",
"http://www.w3.org/XML/1998/namespace": "xml",
"urn:mace:shibboleth:2.0:resolver:dc": "dc"
}
When I write the document to a file, or dump it to stdout, it omits the "enc" and "pc" namespaces. Like the other question, "enc" and "pc" aren't used to qualify elements, but are used in qualifying attribute values. I could force them to show up by adding them to the document manually...
root.set("xmlns:enc", "urn:mace:shibboleth:2.0:attribute:encoder")
root.set("xmlns:pc", "urn:mace:shibboleth:2.0:resolver:pc")
It feels like I shouldn't have to do that. Is there a way to force xml.etree to output all of the defined namespaces when you output a document?
Liam
root.set
workaround! Some kwarg option likeforce=True
forregister_namespace
would be much nicer. – Cannot