如何使用 python 中的 lxml 访问 XML 中具有相同名称的嵌套子项

How to access nested children with same name in XML using lxml in python

我正在尝试使用 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>

我想为每个 "EL" 报告 isEMPTY 值和 Z、A、P 值列表编写一个文本文件。尽管 I/O 我不明白如何访问此文件。 目前我写了那个代码:

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

for ELtest in tree.xpath('/root/GEOMdata/EL'):
    print (ELtest.findtext('isEMPTY'))

并且输出正确:

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

我的问题的最终解决方案(感谢 Pedro Lobito!)是:

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