Python: specify XMLNS on xml.etree elements

elementtree, python, schema, xml-namespaces

Solution

Here we go:

import xml.etree.ElementTree as ET

xmlns_uris = {'p': 'http://myhost.com/p.xsd',
              'q': 'http://myhost.com/q.xsd'}

def dump_to_XML():
  root_node = ET.Element("root")
  c1_node = ET.SubElement(root_node, "child1")
  c1_node.text = "foo"
  c2_node = ET.SubElement(root_node, "child2")
  gc1_node = ET.SubElement(c2_node, "grandchild1")
  gc1_node.text = "bar"
  annotate_with_XMLNS_prefixes(gc1_node, 'q', False)
  annotate_with_XMLNS_prefixes(root_node, 'p')
  add_XMLNS_attributes(root_node, xmlns_uris)
  return ET.tostring(root_node, encoding='UTF-8', method='xml')

def annotate_with_XMLNS_prefixes(tree, xmlns_prefix, skip_root_node=True):
    if not ET.iselement(tree):
        tree = tree.getroot()
    iterator = tree.iter()
    if skip_root_node: # Add XMLNS prefix also to the root node?
        iterator.next()
    for e in iterator:
        if not ':' in e.tag:
            e.tag = xmlns_prefix + ":" + e.tag

def add_XMLNS_attributes(tree, xmlns_uris_dict):
    if not ET.iselement(tree):
        tree = tree.getroot()
    for prefix, uri in xmlns_uris_dict.items():
        tree.attrib['xmlns:' + prefix] = uri

Executing: `print dump_to_XML()` gives:

<?xml version='1.0' encoding='UTF-8'?>
<root xmlns:p="http://myhost.com/p.xsd" xmlns:q="http://myhost.com/q.xsd">
    <p:child1>foo</p:child1>
    <p:child2>
        <q:grandchild1>bar</q:grandchild1>
    </p:child2>
</root>

Problem

in my Python code I'm currently using the `xml.etree` library to create a tree and then dump it to an XML string. Unfortunately I can't use modules other than the ones in the Python Standard Libraries to do that. Here is my code: ``` import xml.etree.ElementTree as ET def dump_to_XML(): root_node = ET.Element("root") c1_node = ET.SubElement(root_node, "child1") c1_node.text = "foo" c2_node = ET.SubElement(root_node, "child2") gc1_node = ET.SubElement(c2_node, "grandchild1") gc1_node.text = "bar" return ET.tostring(root_node, encoding='utf8', method='xml') ``` which gives the string: ``` <?xml version='1.0' encoding='utf8'?> <root> <child1>foo</child1> <child2> <grandchild1>bar</grandchild1> </child2> </root> ``` Now, I have two schema files located - say - `http://myhost.com/p.xsd` and `http://myhost.com/q.xsd`, I want the output string to be turned into: ``` <?xml version='1.0' encoding='UTF-8'?> <root xmlns:p="http://myhost.com/p.xsd" xmlns:q="http://myhost.com/q.xsd"> <p:child1>foo</p:child1> <p:child2> <q:grandchild1>bar</q:grandchild1> </p:child2> </root> ``` How can I leverage the `etree` library in order to achieve that? Thanks in advance

Original source