me--
me--

Reputation: 2148

Outputting an "unused" XML namespace using ElementTree

I'm using Python 3.2's xml.etree.ElementTree, and am attempting to generate XML like this:

<XnaContent xmlns:data="Model.Data">
    <Asset Type="data:MyData">
        ...

The format is out of my control (it's XNA). Notice that the data XML namespace is never actually used to qualify elements or attributes, but rather to qualify attribute values to XNA. My code looks like this:

root = Element('XnaContent')
ET.register_namespace('data', 'Model.Data') 
asset = SubElement(root, 'Asset', {"Type": "data:MyData"})

However, the output looks like (pretty-printed by me):

<XnaContent>
    <Asset Type="data:MyData">
        ...
    </Asset>
</XnaContent>

How can I get the data XML namespace included in the output?

Upvotes: 2

Views: 558

Answers (2)

unutbu
unutbu

Reputation: 879471

import xml.etree.ElementTree as ET
content = '''
<XnaContent>
  <Asset Type="data:MyData"/>
  <Asset Type="data:MyData"/>
</XnaContent>'''
doc = ET.fromstring(content)
ET.register_namespace('data','ModelData')
tree = ET.ElementTree(doc)
root = tree.getroot()
root.tag = '{ModelData}XnaContent'
print(ET.tostring(root, method = 'xml'))

yields

<data:XnaContent xmlns:data="ModelData">
      <Asset Type="data:MyData" />
      <Asset Type="data:MyData" />
    </data:XnaContent>

Upvotes: 0

root
root

Reputation: 80346

>>>print ET.tostring(doc, pretty_print=True)
<XnaContent>
  <Asset Type="data:MyData"/>
  <Asset Type="data:MyData"/>
</XnaContent>
>>> tree=ET.ElementTree(doc)
>>> root=tree.getroot()
>>> nsmap=root.nsmap
>>> nsmap['data']="ModelData"
>>> new_root = ET.Element(root.tag, nsmap=nsmap)
>>> print ET.tostring(new_root, pretty_print=True)
<XnaContent xmlns:data="ModelData"/>
>>> new_root[:] = root[:]
>>> print ET.tostring(new_root, pretty_print=True)
<XnaContent xmlns:data="ModelData">
  <Asset Type="data:MyData"/>
  <Asset Type="data:MyData"/>
</XnaContent>

Upvotes: 2

Related Questions