2012-05-25 20 views
10

與此python 2.7.3(或2.7.0)代碼我想更改屬性值「android:versionCode ='2'」,其中有命名空間前綴「機器人」:Python 2.7:類型對象「ElementTree」沒有屬性「register_namespace」

#!/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) 

當不使用與評論說:「問題就在這裏」代碼行,ElementTree的是自動命名的命名空間別名http://schemas.android.com/apk/res/android爲「NS0」(導致「NS0:的versionCode ='3'「

因此,我使用ElementTree.register_namespace將名稱空間url映射到別名」android「,該文件記錄爲here

我得到的,當我嘗試這樣做的錯誤是:

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

任何人都知道這是爲什麼不工作?這個方法應該在Python 2.7中可用。

回答

23

register_namespace() is a function contained within the ElementTree module
包含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 
+0

輝煌,僅此而已。謝謝伯尼。 – derFunk

+0

乾杯,隊友。快樂的編碼給你 – bernie

+0

有5個堆棧溢出類似的問題,這是唯一正確的答案,謝謝 – seibelj

相關問題