如何在python中使用lxml访问XML中同名的嵌套子级
我正在尝试使用Python中的“lxml”模块解析XML文件。 我的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> <
<?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