root.findall 不返回任何关于 XML 解析的内容



我正在尝试通过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,它产生了消息"内部循环",正如您在点击上面的链接时所看到的那样。

最新更新