Python 2.7 and xml.etree: how to create an XML file with multiple namespaces?
Question: I'm trying to _create_ an XML file so that it has the following skeleton,
preferably using the xml.etree modules in Python 2.7:

    
    
    <?xml version="1.0"?>
    <foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" thing1="this" thing2="that">
      ....
      <somedata bar="1">
        <moredata whatsit="42"></moredata>
      </somedata>
      ....
    </foo>
    

**It's the "foo ...." line that vexes me.** I tried using nsmap for bringing
in xsi and xsd, but that led to a "cannot serialize" error.

I could construct or otherwise hack that line's text to be exactly as I want
it, but **I'd like to learn to do this programmatically using xml.etree**
(pulling in an external library is not preferable in this situation).

I'd think this is a common pattern but I'm just not finding it anywhere for
Python and etree.


Answer: If the prefixes are used in the document; you could call
`register_namespace()` to add them:

    
    
    import sys
    import xml.etree.ElementTree as etree
    
    xsi =  "http://www.w3.org/2001/XMLSchema-instance"
    xsd =  "http://www.w3.org/2001/XMLSchema"
    ns = {"xmlns:xsi": xsi, "xmlns:xsd": xsd}
    for attr, uri in ns.items():
        etree.register_namespace(attr.split(":")[1], uri)
    
    foo = etree.Element("foo",
        dict(thing1="this", thing2="that")) # put `**ns))` if xsi, xsd are unused
    somedata = etree.SubElement(foo, "somedata", dict(bar="1"))
    etree.SubElement(somedata, "moredata",
        {"whatsit": "42", etree.QName(xsi, "type"): etree.QName(xsd, "string")})
    
    etree.ElementTree(foo).write(sys.stdout, xml_declaration=True)
    

Otherwise, you could set the attributes explicitly (`ns` dict) if you need it.

