Я озадачен обработкой пространства имен в ElementTree.Мне нужно проанализировать различные деревья, имеющие разные пространства имен по умолчанию.ElementTree, похоже, сохраняет первое сопоставление пространства имен, которое я определяю в find ().
В следующем коде я ожидаю, что второй проход к barf при поиске D , потому что D не находится в пространстве имен, которое передается для поиска ().Вместо этого он действительно находит 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 (64-разрядная версия)