Разрешает ли ElementTree в Python только одно сопоставление пространства имен? - PullRequest
0 голосов
/ 22 ноября 2018

Я озадачен обработкой пространства имен в 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-разрядная версия)

1 Ответ

0 голосов
/ 30 ноября 2018

Вы столкнулись с ошибкой, которая была исправлена ​​в Python 3.3, но не в Python 2.7: https://bugs.python.org/issue17011 («ElementPath игнорирует разные сопоставления пространства имен для одного и того же выражения пути»).

При использовании Python 3.7 это действительно элемент D, который вызывает ошибку AssertionError.

...