12

使用此 python 2.7.3(或 2.7.0)代码,我想更改属性“android:versionCode='2'”的值,该属性具有命名空间前缀“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)

当不使用注释为“Problem here”的代码行时,ElementTree 会将http://schemas.android.com/apk/res/android的命名空间别名自动命名为“ns0”(导致“ns0:versionCode= '3'”。

因此,我使用 ElementTree.register_namespace 将命名空间 url 映射到别名“android”,这在此处记录。

我尝试这样做时得到的错误是:

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

有人知道为什么这不起作用吗?这个方法应该在 python 2.7 中可用。

4

1 回答 1

27

register_namespace()是 ElementTree模块中包含的一个函数。
包含在ElementTree类中...

顺便说一句:由于这样做有时会引起混淆,因此通常不建议对模块和类使用相同的名称。但是我们现在不打算通过重命名一个广泛使用的模块来破坏生产代码,是吗?

您只需要更改代码:

#!/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
于 2012-05-25T16:10:57.070 回答