Чтобы правильно отформатировать XML, я добавил пространство имен к вашему образцу:
<spirit:Bus xmlns:spirit="http://dummy.com">
...
</spirit:Bus>
, но Шина по-прежнему является root узлом, как в вашем примере. Конечно, вы можете изменить указанный URL-адрес на любой, какой у вас будет sh.
. Для выполнения вашей задачи исключительно в ElementTree вы можете использовать следующий код:
import xml.etree.ElementTree as et
tree = et.parse('Input.xml')
root = tree.getroot()
ns = {'spirit': 'http://dummy.com'}
for nd in root.findall('spirit:Ports/spirit:port', ns):
print(nd.tag.split('}')[1], nd.findtext('spirit:name', namespaces=ns),
nd.findtext('spirit:wire/spirit:direction', namespaces=ns),
nd.findtext('spirit:wire/spirit:driver/spirit:defaultValue', namespaces=ns))
Обратите внимание, что ваш XML содержит спецификацию пространства имен, поэтому вы также должны указать ее в коде.
Мой код также показывает, как получить local имя узла ( без пространства имен).
Результат для вашего образца:
port ABCPORT INPUT 0
port PQRPORT OUTPUT None