12

このpython2.7.3(または2.7.0)コードを使用して、名前空間プレフィックス「android」を持つ属性「android:versionCode='2'」の値を変更したいと思います。

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

「Problemhere」とコメントされたコード行を使用しない場合、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'

なぜこれが機能しないのか誰かが知っていますか?このメソッドは、Python2.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 に答える