Подтвердить что ты не робот

Python 2.7: тип объекта "ElementTree" не имеет атрибута "register_namespace"

с этим кодом 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)

Если не использовать строку кода, прокомментированную с "Проблема здесь", 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.

4b9b3361

Ответ 1

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* `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* `dump()` function