ElementTree XPath странное поведение - PullRequest
3 голосов
/ 16 февраля 2011

Привет
Я использую ElementTree (1.3) с Python 2.7 и наслаждаюсь функциональностью XPath,
однако один из результатов поиска меня удивил.

Мой пример XML:

<OTF>
  <FECS state="disabled" version="2.2.0.0">
    <BackEndCompatibility major="2.2" state="disabled">
        <BackEnd state="disabled" version="2.2.0.0"/>
    </BackEndCompatibility>
  </FECS>
</OTF>

Вопрос 1:
Когда я использую findall, чтобы получить первый найденный элемент

version = "2.2.0.0"
found = list(txml.findall(".//BackEnd[@version='%s']" % version))
return found and found[0] or None

ничего не находит.

Однако, когда я изменяю файл XML, так что элемент BackEnd содержит подэлементов ,

        <BackEnd state="disabled" version="2.2.0.0">
           <any_dummy_element/> 
        </BackEnd>

, тогда искомый элемент будет найден правильно.

Сталкивались ли вы с таким поведением?
Я что-то делаю неправильно или это ошибка в реализации ElementTree?

Вопрос 2:
У меня есть еще одна проблема: xmlns.
Предположим, я изменил первую строку XML на xmlns:

<OTF xmlns="http://si-wiki/OTFCompatibility">
</OTF>

. В таком случае мне нужно изменить строку поиска на:

".//{http://si-wiki/OTFCompatibility}BackEnd[@version='%s']"

Есть ли способ сказать ElementTree игнорировать xmlns во время синтаксического анализа и обрабатывать имена всех элементов (включая root), как будто они не имеют префикса?

С уважением,
Збигнев

1 Ответ

1 голос
/ 18 февраля 2011

Для вопроса № 1:
Когда я заменил строки

    found = list(txml.findall(".//BackEnd[@version='%s']" % version))
    return found and found[0] or None

на

    found = txml.findall(".//BackEnd[@version='%s']" % version)
    if found:
        return found[0]
    return None

, тогда верный результат будет возвращен без взлома пустышки.

...