我正在尝试通过root.findall
使用Python解析xml文件。
基本上我的文件看起来像这样 - 我正在尝试访问"Level3"下的元素。
编辑:@trincot,已经提供的解决方案.....但是,现在,我已经将命名空间添加到示例数据(xmlns="http://xyz.abc/forms"),这导致了麻烦。为什么添加"xmlns="会导致问题?:O
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xyz.abc/forms" xmlns:abc="http://bus-message-envelope" xmlns:env="http://www.w3.org/2003/05/soap-envelope" abc:version="1-2">
<env:Header>
<abc:col1>col1Text</abc:col1>
<abc:col2>col2Text</abc:col2>
<abc:col3>col3Text</abc:col3>
</env:Header>
<env:Body>
<Level1>
<Level2 schemaVersion="1-1">
<Level3>
<cell1>cell1Text</cell1>
<cell2>cell2Text</cell2>
<cell3>cell3Text</cell3>
<cell4>cell4Text</cell4>
</Level3>
</Level2>
</Level1>
</env:Body>
</env:Envelope>
尝试这个,但没有返回任何内容:
from xml.etree import ElementTree
tree = ElementTree.parse("/tmp/test.xml")
root = tree.getroot()
for form in root.findall(".//Level3"):
print(form.text)
print("Inside Loop") --> Not even hitting this
预期输出:
cell1Text
cell2Text
cell3Text
cell4Text
我能够通过下面的代码访问相同的元素。但是,如何使用findall
实现这一目标?
for x in root[1][0][0][0]:
print(x.text)
输出:
cell1Text
cell2Text
cell3Text
cell4Text
我确实经历了Stack Overflow的大部分内容,但无法得到答案。尝试了很多事情,但失败了:(.
在第一个代码片段中,您可以访问form.text
,但form
对应于除了空格之外没有其他文本的Level3
元素。要输出的实际文本位于其子节点中。因此print(form.text)
只打印空白。
工作代码迭代同一Level3
元素的子元素:
for x in root[1][0][0][0]:
print(x.text)
这里x
是更深层次的cellX
元素,它确实具有您期望的文本。
要通过findall
做到这一点,请执行以下操作:
for x in root.findall(".//Level3/*"):
print(x.text)
请注意findall
参数中的额外级别/*
,这意味着:Level3
元素的任何子元素。
查看在 repl.it 上运行的原始代码和更正后的代码
如果您在第一个版本中没有得到任何输出,请检查拼写。XML 中的元素有时以大写字母开头(如Level3
),有时不以大写字母开头(如cell1
),这看起来很可疑。这可能是无法获得输出的原因。但是,我按原样加载了您的代码和 XML,它产生了消息"内部循环",正如您在点击上面的链接时所看到的那样。