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