Не могу найти узел в XML ( etree find ). Как правильно описать вызов find?
Есть xml файл
<ns:Documents
xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01"
xmlns:wb="http://fsrar.ru/WEGAIS/TTNSingle_v4">
<ns:Document>
<ns:WayBill_v4>
<wb:Header>
<wb:Shipper>
</wb:Shipper>
<wb:Consignee>
</wb:Consignee>
</wb:Header>
</ns:WayBill_v4>
</ns:Document>
</ns:Documents>
Мне требуется найти узел грузополучателя или Consignee
Написал вот такой код
import xml.etree.cElementTree as et
tree = et.parse( "WayBill.xml" )
root = tree.getroot()
wb_Consignee = root.find( 'wb:Consignee' )
print( wb_Consignee ) # None
Consignee = root.find( 'Consignee' )
print( Consignee ) # None
Подскажите, что не так ?
Ответы (2 шт):
Автор решения: alex
→ Ссылка
@splash58 подсказал, куда копать. Спасибо ему. 2 - 3 часа обучения и всё взошло
Вот результат
from lxml import etree
tree = etree.parse( "WayBill.xml" )
root = tree.getroot() # Documents
ns = root.nsmap
doc = root.find( "ns:Document", ns )
wb = doc.find( "ns:WayBill_v4", ns )
head = wb.find( "wb:Header", ns )
consignee = head.find( "wb:Consignee", ns )
print( consignee )
Автор решения: alex
→ Ссылка
Более короткая версия, с использованием XPath
from lxml import etree
tree = etree.parse( "WayBill.xml" )
root = tree.getroot() # Documents
ns = root.nsmap
consignee = root.find( './/wb:Consignee', ns )
# .// означает поиск по всему документу, а не только по детям
print( consignee )