2012-05-25 54 views
10

このpython 2.7.3(または2.7.0)コードで属性の値を変更したい "android:versionCode = '2'"名前空間接頭辞「アンドロイド」があります:versionCode:Python 2.7:typeオブジェクト "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」(への名前空間のエイリアスを自動命名されます= '3' "。

したがって、私はElementTree.register_namespaceを使用して、ネームスペースURLを別名「アンドロイド」にマッピングします。これは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

関連する問題