Рассмотрим следующий XML:
<?xml version="1.0"?>
<actors xmlns:fictional="http://characters.example.com"
xmlns="http://people.example.com">
<actor>
<name>John Cleese</name>
<fictional:character>Lancelot</fictional:character>
<fictional:character>Archie Leach</fictional:character>
</actor>
<actor>
<name>Eric Idle</name>
<fictional:character>Sir Robin</fictional:character>
<fictional:character>Gunther</fictional:character>
<fictional:character>Commander Clement</fictional:character>
</actor>
</actors>`
Мы можем использовать методы find или findall для извлечения элемента, но когда в вашем XML есть пространства имен, мы должны использовать правильное пространство имен перед именем элемента.
for actor in root.findall('{http://people.example.com}actor'):
name = actor.find('{http://people.example.com}name')
Мы можем упростить его, используя словарь пространств имен:
ns = {'real_person': 'http://people.example.com',
'role': 'http://characters.example.com'}
for actor in root.findall('real_person:actor', ns):
name = actor.find('real_person:name', ns)
Что, если нам нужно прочитать XML с динамическими пространствами имен?
dynamicNS = root.tag.replace('actors', '')
for actor in root.findall(dynamicNS+'actor'):
name = actor.find(dynamicNS+'name')
Мы можем использовать XPath, если нам нужно найти элемент во всем дереве XML, в следующем примере мы хотим получить все элементы «имя» в xml:
root.findall('.//'+dynamicNS+'name'):
Вот и все, если вы хотите узнать больше об ElementTree XML Api, вам следует посетить официальную документацию.