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.
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