xml данные, объединяющие данные в одну переменную - PullRequest
0 голосов
/ 09 января 2020

Если существует более одной лицензии, они должны указывать один ключ. Если больше чем 1, это должно соответствовать одной лицензии

Входные данные файла:

<report>
    <report_header> SunDirect<report_header/>
        <Category> Single </Category>
        <Licenses>
            <License>1234</License>
            <License>525</License>
        </Licenses>
    <report_header> Tatasky<report_header/>
        <Category> Double </Category>
        <Licenses>
            <License>322</License>
            <License>1285</License>
            <License>1896</License>
        </Licenses>
    <report_header> SunDirect <report_header/>
        <Category> Multiple </Category>
        <Licenses>
            <License>1222</License>
        </Licenses>  
</report>

Исходный код:

import xml.etree.ElementTree as ET
tree = ET.parse('sample.xml')
root = tree.getroot()
way_list=[]
for item in root.findall('./reportheader'):
  for child in item:
    if child.tag == 'Category':
      way_list['category'] = child.text
    if child.tag == 'Licenses':
      for item1 in child.iter('License'):
        way_list['license'] = item1.text
        print(way_list)

Токовый выход:

{category: single, License: 1234}

{category: single, License: 525}

{category: Double, License: 322}

{category: Double, License: 1285}

{category: Double, License: 1896}

Ожидаемый выход:

{category: single, License: 1234,525}

{category: Double, License: 322,1285,1896}

1 Ответ

0 голосов
/ 12 января 2020

Следующее достаточно близко к тому, что вы хотите, поэтому вы можете попробовать изменить его в соответствии с вашими потребностями:

way_list=[]
targets = tree.iterfind('*') #or in your case, possible 'root'
for m in targets: 
    d1 = dict()   
    d1[m.tag]=[]
    d1[m.tag]=m.text    
    licenses =[]
    for l in m.iterfind('*'):   
        licenses.append(l.text)
        d1[m.tag]=licenses
    way_list.append(d1)
chunk_size = len(tree.findall('report_header'))
seg = len(way_list)//chunk_size
for i in range(chunk_size):    
    print(way_list[i*seg:(i+1)*seg])

Вывод:

[{'report_header': ' SunDirect'}, {'Category': ' Single '}, {'Licenses': ['1234', '525']}]
[{'report_header': ' Tatasky'}, {'Category': ' Double '}, {'Licenses': ['322', '1285', '1896']}]
[{'report_header': ' SunDirect '}, {'Category': ' Multiple '}, {'Licenses': ['1222']}]

Я все равно рекомендую вы, ребята, переключаетесь на что-то вроде l xml или что-то еще, поддерживающее xpath ....

...