ElementTree XPath - выбор элемента на основе атрибута

У меня возникли проблемы с использованием 9X_xml.etree атрибута XPath Selector в ElementTree, что 9X_pythonic я могу сделать в соответствии с Documentation

Вот пример 9X_elementtree кода

XML

     

Python

def parse(document): root = et.parse(document) for target in root.findall("//target[@name='a']"): print target._children 

Я получаю следующее исключение:

expected path separator ([) 

48
2

  • При использовании ElementTree 1.2.6 ...
2
Общее количество ответов: 2

Ответ #1

Ответ на вопрос: ElementTree XPath - выбор элемента на основе атрибута

Синтаксис, который вы пытаетесь использовать, является 9X_python-shell новым в ElementTree 1.3.

Такая версия поставляется с Python 2.7 или 9X_celementtree выше. Если у вас Python 2.6 или меньше, у 9X_python-shell вас все еще есть ElementTree 1.2.6 или меньше.

37
0

Ответ #2

Ответ на вопрос: ElementTree XPath - выбор элемента на основе атрибута

В этом коде есть несколько проблем.

  1. Встроенный 9X_python-shell Python ElementTree (сокращенно ET) не имеет 9X_python реальной поддержки XPATH; только ограниченное 9X_xml.etree подмножество. Например, он не поддерживает 9X_python-shell выражения поиск из корня, такие как //target.

    Примечание: documentation упоминает 9X_elementtree "//", но только для детей: поэтому 9X_etree выражение как .//target действителен; //... нет!

    Существует 9X_pythonista альтернативная реализация: lxml, более богатая. По 9X_pythonic швам используется документация для встроенного 9X_python-interpreter кода. Это не соответствует / не работает.

  2. Обозначение 9X_etree @name выбирает xml- атрибуты; выражение key=value в теге xml.

    Таким 9X_pythonista образом, это имя-значение должно быть 1 9X_celementtree или 2, чтобы выбрать что-то в данном документе. Или 9X_xml.etree можно искать цели с помощью дочернего элемента 'a': target[a] (no 9X_pythonista @).

Для данного документа, проанализированного 9X_python с помощью встроенного ElementTree (v1.3) для 9X_etree получения root-прав, следующий код верен 9X_py и работает:

  • root.findall(".//target") Найдите обе цели
  • root.findall(".//target/a") Найдите два a-элемента
  • root.findall(".//target[a]") Это снова находит оба целевых элемента, поскольку оба имеют a-элемент
  • root.findall(".//target[@name='1']") Найдите только первую цель. Обратите внимание, что необходимы кавычки около 1; иначе возникает SyntaxError
  • root.findall(".//target[a][@name='1']") Также действителен; найти эту цель
  • root.findall(".//target[@name='1']/a") Находит только один a-элемент; ...

32
0