12

with this python 2.7.3 (or 2.7.0) code I want to change the value of the attribute "android:versionCode='2'", which has the namespace prefix "android":

#!/usr/bin/python
from xml.etree.ElementTree import ElementTree, dump
import sys, os

# Problem here:
ElementTree.register_namespace("android", "http://schemas.android.com/apk/res/android")

tree = ElementTree()
tree.parse("AndroidManifest.xml")
root = tree.getroot()
root.attrib["{http://schemas.android.com/apk/res/android}versionCode"] = "3"

dump(tree)

When not using the line of code commented with "Problem here", ElementTree is auto-naming the namespace alias for http://schemas.android.com/apk/res/android to "ns0" (resulting in "ns0:versionCode='3'".

Thus I'm using ElementTree.register_namespace to map the namespace url to the alias name "android", which is documented here.

The error I get when I try to do this is:

AttributeError: type object 'ElementTree' has no attribute 'register_namespace'

Anybody knows why this is not working? This method should be available in python 2.7.

derFunk
  • 1,587
  • 2
  • 20
  • 31

1 Answers1

27

register_namespace() is a function contained within the ElementTree module.
It is not contained within the ElementTree class...

An aside: Because of the confusion that is sometimes caused by doing so it is generally not recommended to use the same name for both module and class. But we are not about to break production code by renaming a widely used module now are we?

You simply need to change your code:

#!/usr/bin/python
import xml.etree.ElementTree as ET # import entire module; use alias for clarity
import sys, os

# note that this is the *module*'s `register_namespace()` function
ET.register_namespace("android", "http://schemas.android.com/apk/res/android")

tree = ET.ElementTree() # instantiate an object of *class* `ElementTree`
tree.parse("AndroidManifest.xml")
root = tree.getroot()
root.attrib["{http://schemas.android.com/apk/res/android}versionCode"] = "3"

ET.dump(tree) # we use the *module*'s `dump()` function
mechanical_meat
  • 163,903
  • 24
  • 228
  • 223
  • Cheers, mate. Happy coding to you – mechanical_meat May 25 '12 at 16:28
  • There's like 5 similar questions on stack overflow and this is the only correct answer, thank you – seibelj Feb 28 '13 at 16:13
  • +1 Because you answered the question and offered relevant related information, even though it was not required for the stated problem. Also be cause the format of your response allows the user to quickly get the answer if they do not want the extra information. – slbass Mar 04 '14 at 17:05
  • Thank you, slbass. When time permits my goal is to address what I think is the root cause of the question in addition to the question that is asked. – mechanical_meat Mar 05 '14 at 04:19