Я смущен обработкой пространства имен ElementTree для сопоставлений пространств имен. Мне нужно разбирать различные деревья, имеющие разные пространства имен по умолчанию. ElementTree, похоже, сохраняет первое сопоставление пространства имен, которое я указываю в find().
В следующем коде я ожидаю, что второй проход barf на поиск D, потому что D не находится в пространстве имен, которое передается find(). Вместо этого он находит D (который имеет неправильное пространство имен), но barfs на B (который он должен найти).
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
# Run code for two namespaces
namespaces = [ "http://www.example.org/X", "http://www.example.org/Y"]
for ns in namespaces:
try:
# make an XML document as a string
xmlString='''
<A xmlns="{ns}" xmlns:static="http://www.example.org/X">
<B>
<C>sam</C>
</B>
<static:D>
<C>sam</C>
</static:D>
</A>
'''.format(ns=ns)
print(xmlString)
tree = ET.fromstring(xmlString)
# See what namespace is used for the root element
print("treetag: {}".format(tree.tag))
# Find the element with the explicit namespace
elementD = tree.find("ns0:D", { "ns0":ns})
assert elementD != None, "elementD not found"
print("elementD: {}".format(elementD.tag))
# Find the element with the default namespace
elementB = tree.find("ns0:B", { "ns0":ns})
assert elementB != None, "elementB not found"
print("elementB: {}\n".format(elementB.tag))
except AssertionError as e:
print repr(e)
Что-то не так с моим кодом? Если нет, как я могу заставить find() использовать правильное сопоставление пространства имен?
Окружающая среда: Mac OS X, Python 2.7.14 | Anaconda custom (64-разрядная версия)
Вы попали в ошибку, которая была исправлена в Python 3.3, но не в Python 2.7: https://bugs.python.org/issue17011 ("ElementPath игнорирует разные сопоставления пространства имен для одного и того же выражения пути").
При использовании Python 3.7, действительно, элемент D
вызывает AssertionError.
D
как и ожидалось. Смотрите bugs.python.org/issue17011