Forcing xml.etree to output "unused" namespaces
Asked Answered
K

0

9

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

Kobi answered 3/7, 2014 at 14:59 Comment(2)
Just ran into the same problem myself and couldn't find a solution better than your root.set workaround! Some kwarg option like force=True for register_namespace would be much nicer.Cannot
Have you tried to use lxml instead of ElementTree? lxml does not remove namespace declarations. See https://mcmap.net/q/1321129/-why-does-xml-package-modify-my-xml-file-in-python3.Haughty

© 2022 - 2024 — McMap. All rights reserved.