Как мне пройти через XML и правильно распечатать с помощью elementtree в python? - PullRequest
0 голосов
/ 25 февраля 2019

Я получаю каждый childtwo в целом xml, напечатанном с каждым childone во всем документе.Как мне получить только childtwos, которые идут с childone?

import xml.etree.ElementTree as ET            
tree = ET.parse("C:/Users/thisuser/Desktop/test.xml")
root = tree.getroot()

for ticket in root.findall('.//Parent'):
    Childone = ticket.find('.//Childone').text

    for ticket in root.findall('.//ParentTwo'):
        Childtwo = ticket.find('.//Childtwo').text

        print "Childone={Childone}, Childtwo={Childtwo}".format(Childone=Childone, Childtwo=Childtwo)

Результат

ChildOne=1  ChildTwo=a
ChildOne=1  ChildTwo=b
ChildOne=1  ChildTwo=c
ChildOne=1  ChildTwo=d

ChildOne=2  ChildTwo=a
ChildOne=2  ChildTwo=b
ChildOne=2  ChildTwo=c
ChildOne=2  ChildTwo=d

Желаемый результат

ChildOne=1  ChildTwo=a
ChildOne=1  ChildTwo=b

ChildOne=2  ChildTwo=c
ChildOne=2  ChildTwo=d

Пример XML

<Parent>
    <Childone>1</Childone>
        <ParentTwo>
            <Childtwo>a</Childtwo>
        </ParentTwo>
        <ParentTwo>
            <Childtwo>b</Childtwo>
        </ParentTwo>
</Parent>

<Parent>
    <Childone>2</Childone>
        <ParentTwo>
            <Childtwo>c</Childtwo>
        </ParentTwo>
        <ParentTwo>
            <Childtwo>d</Childtwo>
        </ParentTwo>
</Parent>

1 Ответ

0 голосов
/ 26 февраля 2019

Проблема в том, что вы используете root в findall вашего второго for цикла:

for ticket in root.findall('.//ParentTwo'):

Вместо этого вы должны использовать ticket из внешнего цикла для ограничениякакие ParentTwo элементы найдены.(Также обратите внимание, что я изменил ticket на ticket2, поскольку вы уже использовали ticket.):

for ticket2 in ticket.findall('.//ParentTwo'):

Полный отредактированный код ...

import xml.etree.ElementTree as ET
tree = ET.parse("C:/Users/thisuser/Desktop/test.xml")
root = tree.getroot()

for ticket in root.findall('.//Parent'):
    Childone = ticket.find('.//Childone').text

    for ticket2 in ticket.findall('.//ParentTwo'):
        Childtwo = ticket2.find('.//Childtwo').text

        print "Childone={Childone}, Childtwo={Childtwo}".format(Childone=Childone, Childtwo=Childtwo)
...