Учитывая следующий базовый код:
import xml.etree.ElementTree as ET
root = ET.fromstring(xml)
Давайте построим поверх него, чтобы получить желаемый результат.
Ваш начальный поиск для .//Body
x-path возвращает NONE, потому что онне существует в вашем XML-ответе.
Каждый тег в вашем XML имеет пространство имен , связанное с ним. Более подробную информацию о пространствах имен xml можно найти здесь .
Рассмотрим следующую строку со значением xmlns
(пространство имен xml):
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
Значение пространства именS
установлено на http://www.w3.org/2003/05/soap-envelope
.
Замена S
в {S}Envelope
на указанное выше значение даст вам итоговый тег для поиска в вашем XML:
root.find('{http://www.w3.org/2003/05/soap-envelope}Envelope') #top most node
Нам нужно сделать то же самое для <S:Body>
.
Чтобы получить <S:Body>
элементов и их дочерних узлов, вы можете сделать следующее:
body_node = root.find('{http://www.w3.org/2003/05/soap-envelope}Body')
for response_child_node in list(body_node):
print(response_child_node.tag) #tag of the child node
print(response_child_node.get('status')) #the status you're looking for
Выходы:
{urn:oasis:names:tc:ebxml-regrep:xsd:query:3.0}AdhocQueryResponse
urn:oasis:names:tc:ebxml-regrep:ResponseStatusType:Success
В качестве альтернативы
Вы также можете напрямую найти все {query}AdhocQueryResponse
в своем XML, используя:
response_nodes = root.findall('.//{urn:oasis:names:tc:ebxml-regrep:xsd:query:3.0}AdhocQueryResponse')
for response in response_nodes:
print(response.get('status'))
Выходы:
urn:oasis:names:tc:ebxml-regrep:ResponseStatusType:Success