如何在python中使用lxml访问XML中同名的嵌套子级

如何在python中使用lxml访问XML中同名的嵌套子级,python,python-3.x,lxml,Python,Python 3.x,Lxml,我正在尝试使用Python中的“lxml”模块解析XML文件。 我的xml是: <?xml version="1.0"?> <root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <GEOMdata> <numEL>2</numEL> <

我正在尝试使用Python中的“lxml”模块解析XML文件。 我的xml是:

<?xml version="1.0"?>
<root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <GEOMdata>
        <numEL>2</numEL>
        <EL>
            <isEMPTY>true</isEMPTY>
            <SECdata>
                <SEC>
                    <Z>10.00</Z>
                    <A>20.00</A>
                    <P>30.00</P>
                </SEC>
                <SEC>
                    <Z>40.00</Z>
                    <A>50.00</A>
                    <P>60.00</P>
                </SEC>
            </SECdata>
        </EL>
        <EL>
            <isEMPTY>false</isEMPTY>
            <SECdata>
                <SEC>
                    <Z>15.00</Z>
                    <A>25.00</A>
                    <P>35.00</P>
                </SEC>
                <SEC>
                    <Z>45.00</Z>
                    <A>55.00</A>
                    <P>65.00</P>
                </SEC>
            </SECdata>
        </EL>
    </GEOMdata>
</root>
并且输出是正确的:

true
false
现在我不知道如何访问子元素Z,A,p“inside”ELtest

谢谢你的帮助

编辑: 所需的输出是如下格式的文件:

1
true
# Z    A    P #
 10   20   30
 40   50   60

2
false
# Z    A    P #
 15   25   35
 45   55   65

您可以使用以下内容:

from lxml import etree
parser = etree.XMLParser(encoding='UTF-8')
tree = etree.parse("_etree.xml", parser=parser)

with open("output.txt", "w", encoding="utf8") as f:
    e = tree.findall('GEOMdata/EL')
    for i in e:
        isEMPTY = i.find('isEMPTY')
        SECdata = i.findall('SECdata')
        f.write(isEMPTY.text+"\n")
        for y in SECdata:
            z = y.find("SEC/Z").text
            a = y.find("SEC/A").text
            p = y.find("SEC/P").text
            f.write("{} {} {}\n\n".format(z,a, p))

output.txt:

true
10.00 20.00 30.00

false
15.00 25.00 35.00

我的问题的最终解决方案(感谢佩德罗·洛比托!)是:

输出文件为:

true
10.00 20.00 30.00
40.00 50.00 60.00

false
15.00 25.00 35.00
45.00 55.00 65.00

不清楚您需要什么作为输出。请提供一个例子。很抱歉,我刚刚编辑了我的帖子。您已经知道,当您搜索XPath
/root/GEOMdata/EL
时,您会找到所有
元素,对于每一个元素,您都知道
元素的文本是在执行
ELtest.findtext('isEMPTY')
时输出的。现在,当你结合这两个知识点时…只有一个
2
你想如何得到两个值?numEL在本文中是不相关的,但有两个不同的“EL”块非常感谢!我是Python的新手,您真的帮助我理解了“find”和“findall”语句。再次感谢你!伟大的很高兴我能帮助您。似乎只打印了第一个“秒”值。我认为有必要在SECdata中的“y”之后再加上一个“for”循环。我用“iterchildren”解决了这个问题,我将通过添加解决方案来编辑帖子。我错过了最后一个循环,你自己找到了答案,就是这样!老实说,我不介意你把你的答案标为正确答案!不要紧,谢谢。如果没有正确的“查找”输入,我将永远无法找到解决方案!
from lxml import etree
parser = etree.XMLParser(encoding='UTF-8')
tree = etree.parse("_etree.xml", parser=parser)

with open("output.dat", "w", encoding="utf8") as f:
    e = tree.findall('GEOMdata/EL')
    for i in e:
        isEMPTY = i.find('isEMPTY')
        SECdata = i.findall('SECdata')
        f.write(isEMPTY.text+"\n")
        for y in SECdata:
            for k in list(y.iterchildren()):
                z = k.find("Z").text
                a = k.find("A").text
                p = k.find("P").text
                f.write("{} {} {}\n".format(z,a,p))
            f.write("\n")
true
10.00 20.00 30.00
40.00 50.00 60.00

false
15.00 25.00 35.00
45.00 55.00 65.00