Разрешает ли ElementTree в Python только одно сопоставление пространства имен?

1

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

  • 1
    Похоже, ошибка, которая не была исправлена в Python 2.7. С Python 3.7 он делает barf на D как и ожидалось. Смотрите bugs.python.org/issue17011
  • 0
    Ах, я не нашел это в моих поисках, спасибо. Я удивлен, что проблема помечена как исправленная для Python 2.7, когда это явно не так.
Показать ещё 1 комментарий
Теги:
namespaces
elementtree

1 ответ

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню