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.

1 Answer 1

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
Sign up to request clarification or add additional context in comments.

4 Comments

Cheers, mate. Happy coding to you
There's like 5 similar questions on stack overflow and this is the only correct answer, thank you
+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.
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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.