Пожалуйста, несите меня, я борюсь с xml
и ElementTree
от python
. Я разместил вопрос: Как использовать Element.findall () для поиска тега и печати его значения. и предоставленное решение работало нормально, однако позже я понял, что namespace
был зарегистрирован в теге <parent>
. Я понятия не имел, как эта часть данных изменит план игры.
<parent xmlns="http://xmlns.test.com/parent" version="1">
Имея namespace
, этот findall('./*/c/d')
больше не находит вложенные tag
(т.е. c/d
). Читая здесь больше тем, я понял, что мне нужно добавить namespace
вот так.
def search(root, wordToSearch):
tags = root.findall('{http://xmlns.test.com/parent}first')
print tags
Приведенный выше код наверняка найдет тег <first>
, однако я надеюсь получить catch all
путь что-то вроде (./*/c/d
), который будет проходить через тег <first>
, затем <second>
.
Меня беспокоит, что xml
может иметь тег third or even more
под <parent>
в будущем. Есть ли способ сделать это без использования библиотеки lxml
? Кстати, у меня есть и python 2.6.6
, и 2.7.18
на rhel
сервере. Я запускаю скрипт.
[обновление]
К счастью, я смог найти решение с ElementTree 1.3
.
def search(root, wordToSearch):
for child in root: # child represents first and second tag
el = child.tag.split('}', 1)[1] # Remove namespace
el_path = 'xmlns:{0}/xmlns:c/xmlns:d'.format(el)
target_tags = root.findall(el_path, namespaces={'xmlns': 'http://...'})