如果名称重复,是否只能选择一个子元素?

时间:2019-05-04 12:51:01

标签: python xml elementtree

我正在解析Web服务提供的XML,并试图获取somo信息:这是来自智能电表的报告。接下来是XML的一部分:

<Report IdRpt="S04" IdPet="0" Version="3.1">
  <Cnc Id="CUR9737960375">
    <Cnt Id="LGZ0019800498">
       <S04 Fhi="20190401000000000W" Fhf="20190501000000000S" Ctr="1" Pt="0" Mx="157 W" Fx="20190430200000000S">
          <Value AIi="2632 Wh" AEi="0 Wh" R1i="0 varh" R2i="0 varh" R3i="7094 varh" R4i="884 varh"/>
          <Value AIa="20461 Wh" AEa="0 Wh" R1a="0 varh" R2a="0 varh" R3a="147960 varh" R4a="8044 varh"/>
       </S04>
       <S04 Fhi="20190401000000000W" Fhf="20190501000000000S" Ctr="1" Pt="1" Mx="157 W" Fx="20190430200000000S">
          <Value AIi="2632 Wh" AEi="0 Wh" R1i="0 varh" R2i="0 varh" R3i="2650 varh" R4i="885 varh"/>
          <Value AIa="15218 Wh" AEa="0 Wh" R1a="0 varh" R2a="0 varh" R3a="59520 varh" R4a="6145 varh"/>
       </S04>
...

我想获取每个Value参数取决于Pt S04参数。我能够获取每个Value参数,每个Pt都分开,但是我需要每个Pt = 0,Pt = 1 ...

的值。

我尝试了下一个,但是我不得不采取很多措施,与现实不符。那是因为,每个Value部分而不是正确值的循环访问

...
S02_list = ['AIi','AEi','R1i','R2i','R3i', 'R4i']

for medida in S02_list:
    for parse in tree.iter('S04'):
    Pt = parse.get('Pt')
    for intento in tree.iter('Value'):
        z = str(intento.get(medida))
        if z != 'None':
            print ('El valor de '+medida+' para Pt= '+Pt+' es: '+z)

2 个答案:

答案 0 :(得分:0)

您最内在的for循环是遍历树中的所有Value元素,而不仅仅是您当前正在遍历的S04的子级。尝试以下方法:

for intento in parse.iter('Value'):

如果打印顺序不是很关键,您还可以更改循环顺序以仅扫描树一次:

for parse in tree.iter('S04'):
    Pt = parse.get('Pt')
    for intento in parse.iter('Value'):
        for medida in S02_list:
            z = str(intento.get(medida))
            if z != 'None':
                    print ('El valor de '+medida+' para Pt= '+Pt+' es: '+z)

答案 1 :(得分:0)

您需要迭代parse中的for intento in tree.iter('Value'):对象而不是tree上的对象,以便将其更改为for intento in parse.iter('Value'):,然后您的代码将更改为

S02_list = ['AIi','AEi','R1i','R2i','R3i', 'R4i']

for medida in S02_list:
    for parse in root.iter('S04'):
        Pt = parse.get('Pt')
        #Iterate on parse
        for intento in parse.iter('Value'):
            z = str(intento.get(medida))
            if z != 'None':
                print('El valor de ' + medida + ' para Pt= ' + Pt + ' es: ' + z)

输出看起来像

El valor de AIi para Pt= 0 es: 2632 Wh
El valor de AIi para Pt= 1 es: 2632 Wh
El valor de AEi para Pt= 0 es: 0 Wh
El valor de AEi para Pt= 1 es: 0 Wh
El valor de R1i para Pt= 0 es: 0 varh
El valor de R1i para Pt= 1 es: 0 varh
El valor de R2i para Pt= 0 es: 0 varh
El valor de R2i para Pt= 1 es: 0 varh
El valor de R3i para Pt= 0 es: 7094 varh
El valor de R3i para Pt= 1 es: 2650 varh
El valor de R4i para Pt= 0 es: 884 varh
El valor de R4i para Pt= 1 es: 885 varh