Вы были очень близки с вашей первоначальной попыткой.Вам просто нужно внести пару изменений в ваш xpath и небольшое изменение в вашем питоне.
Первая часть вашего xpath начинается с ./Organization
.Поскольку вы делаете xpath от root, он ожидает, что Organization
будет дочерним.Это не;это потомок.
Попробуйте изменить ./Organization
на .//Organization
.(//
это сокращение от /descendant-or-self::node()/
. Для получения дополнительной информации см. Здесь. )
Вторая проблема связана с OrganisationId/[@OrganisationType='DEALER']
.Это неверный путь xpath./
должен быть удален между OrganisationId
и предикатом .
Кроме того, @
- это сокращенный синтаксис для оси attribute::
, а OrganisationType
- это элемент, а не атрибут.
Попробуйте изменить OrganisationId/[@OrganisationType='DEALER']
на OrganisationId[OrganisationType='DEALER']
.
Проблема с питоном связана с print(OrganisationReference.attrib)
.OrganisationReference
не имеет никаких атрибутов;просто текст.
Попробуйте изменить print(OrganisationReference.attrib)
на print(OrganisationReference.text)
.
Вот пример использования только одного XML-файла для демонстрационных целей ...
XML Input (Master1.xml; с добавлением элемента doc
для придания ему правильной формы)
<doc>
<MessageOrganisationCount>a</MessageOrganisationCount>
<MessageVehicleCount>x</MessageVehicleCount>
<MessageCreditLineCount>y</MessageCreditLineCount>
<MessagePlanCount>z</MessagePlanCount>
<OrganisationData>
<Organisation>
<OrganisationId>
<OrganisationType>DEALER</OrganisationType>
<OrganisationReference>WHATINEED</OrganisationReference>
</OrganisationId>
<OrganisationName>XYZ.</OrganisationName>
</Organisation>
</OrganisationData>
</doc>
Python
import xml.etree.ElementTree as ET
tree1 = ET.parse('Master1.xml')
root1 = tree1.getroot()
for OrganisationReference in root1.findall(".//Organisation/OrganisationId[OrganisationType='DEALER']/OrganisationReference"):
print(OrganisationReference.text)
НапечатаноВывод
WHATINEED
Также обратите внимание, что вам не нужно вообще использовать getroot()
.Вы можете использовать findall()
прямо на дереве ...
import xml.etree.ElementTree as ET
tree1 = ET.parse('Master1.xml')
for OrganisationReference in tree1.findall(".//Organisation/OrganisationId[OrganisationType='DEALER']/OrganisationReference"):
print(OrganisationReference.text)