#python #xml #elementtree
#python #xml #elementtree
Вопрос:
У меня есть следующий xml, который будет содержать несколько элементов shareclass (немногие будут иметь код AMFI, а немногие — нет). Для упрощения обоих элементов в моем shareclass я дал код AMFI для кода xml-элемента. Я хочу получить значение кода AMFI (если оно присутствует) и его идентификатор shareclass. Теперь я не могу выполнить правильный цикл для извлечения данных. Я неправильно использую цикл или xml ведет себя таким образом?Приветствуется любая помощь
<Feed xmlns="xxxxx" Version="1.01.021">
<AssetOverview Id="36113117">
<ShareClasses>
<ShareClass Id="68016655">
<Profile>
<CrossReferenceCodes>
<Code Type="RIC" Id="1000026">LP68016655</Code>
<Code Type="ISIN Code" Id="1001424">INF209K01264</Code>
<Code Type="ISIN Currency Class" Id="1005394">INF209K01264.INR</Code>
<Code Type="AMFI Code" Id="1010560">112088</Code>
<Code Type="Perm ID" Id="1036941">18068016655</Code>
</CrossReferenceCodes>
</Profile>
</ShareClass>
<ShareClass Id="68016656">
<Profile>
<CrossReferenceCodes>
<Code Type="RIC" Id="1000026">LP68016656</Code>
<Code Type="ISIN Code" Id="1001424">INF209K01256</Code>
<Code Type="ISIN Currency Class" Id="1005394">INF209K01256.INR</Code>
<Code Type="AMFI Code" Id="1010560">112087</Code>
<Code Type="Perm ID" Id="1036941">18068016656</Code>
</CrossReferenceCodes>
</Profile>
</ShareClass>
</ShareClasses>
</AssetOverview>
</Feed>
Мой код на python
tree = ET.parse('test.xml')
namespace = get_namespace(tree.getroot())
root = tree.getroot()
for child in root:
for code1 in root.findall("./{}AssetOverview/{}ShareClasses/{}ShareClass/{}Profile/{}CrossReferenceCodes/{}Code".format(namespace,namespace,namespace,namespace,namespace,namespace)):
if 'AMFI Code' in code1.attrib.values():
print(code1.text)
for code in root.findall("./{}AssetOverview/{}ShareClasses/{}ShareClass".format(namespace,namespace,namespace)):
print(code.attrib['Id'])
Мой вывод
112088
68016655
68016656
112087
68016655
68016656
Желаемый результат
112088,68016655
112087,68016656
Комментарии:
1. Измените на
code1.findall("./{}AssetOverview
Ответ №1:
Код можно немного упростить. Это приводит к желаемому результату:
from xml.etree import ElementTree as ET
tree = ET.parse('test.xml')
for shareclass in tree.findall(".//{xxxxx}ShareClass"):
id = shareclass.get("Id")
amfi = shareclass.findtext(".//{xxxxx}Code[@Type='AMFI Code']")
print("{},{}".format(amfi, id))