lxml: как искать поля без добавления пути xmlns (localhost) к каждому поисковому запросу?
Я пытаюсь найти поля в файле SOAP xml, используя lxml (3.6.0)
...
<soap:Body>
<Request xmlns="http://localhost/">
<Test>
<field1>hello</field1>
<field2>world</field2>
</Test>
</Request>
</soap:Body>
...
В этом примере я пытаюсь найти field1
а также field2
,
Мне нужно добавить путь к поисковому запросу, чтобы найти поле:
print (myroot.find(".//{http://localhost/}field1").tag) # prints 'field1'
без этого я ничего не нахожу
print (myroot.find("field1").tag) # finds 'None'
Есть ли другой способ поиска тега поля (здесь field1
) без указания пути?
Полный пример ниже:
from lxml import etree
example = """<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body><Request xmlns="http://localhost/">
<Test><field1>hello</field1><field2>world</field2></Test>
</Request></soap:Body></soap:Envelope>
"""
myroot = etree.fromstring(example)
# this works
print (myroot.find(".//{http://localhost/}field1").text)
print (myroot.find(".//{http://localhost/}field2").text)
# this fails
print (myroot.find(".//field1").text)
print (myroot.find("field1").text)
Комментарий: введен запрос SOAP, я не могу изменить его в реальном времени, чтобы упростить процесс.
1 ответ
Есть способ игнорировать пространство имен при выборе элемента с использованием XPath, но это не очень хорошая практика. Пространство имен существует по причине. В любом случае, есть более чистый способ ссылаться на элемент в пространстве имен, то есть с помощью префикса пространства имен, который был сопоставлен с пространством имен uri, вместо использования фактического пространства имен uri каждый раз:
.....
>>> ns = {'d': 'http://localhost/'}
>>> print (myroot.find(".//d:field1", ns).text)
hello
>>> print (myroot.find(".//d:field2", ns).text)
world