Не удается выполнить корректный цикл для извлечения xml-элемента на основе условия

#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))