简体   繁体   English

如何遍历XML并在python中使用elementtree正确打印?

[英]How do I loop through XML and print properly using elementtree in python?

I am getting every childtwo in the whole xml printed with every childone in the whole document. 我得到整个xml中的每个childtwo以及整个文档中的每个childone。 How do I get just the childtwos that go with the 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)

Result 结果

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

Desired Result 所需结果

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

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

XML sample 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>

The issue is that you're using root in the findall of your second for loop: 问题是您在第二个for循环的findall中使用root

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

Instead, you should use ticket from the outer loop to limit what ParentTwo elements are found. 相反,您应该使用外部循环中的ticket来限制找到的ParentTwo元素。 (Also note I changed ticket to ticket2 since you've already used ticket .): (还请注意,因为您已经使用了ticket所以我将ticket更改为ticket2 。):

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

Full edited code... 完整编辑的代码...

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM