【问题标题】:Getting empty list when accessing element and tag in xml file using ElementTree使用 ElementTree 访问 xml 文件中的元素和标签时获取空列表
【发布时间】:2020-07-19 13:25:08
【问题描述】:

思路是为下面的xml获取标签endTime的值:

<epochs xmlns="http://www.egi.com/epochs_mff" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <epoch>
    <beginTime>0</beginTime>
    <endTime>3586221000</endTime>
    <firstBlock>1</firstBlock>
    <lastBlock>897</lastBlock>
  </epoch>
  <epoch>
    <beginTime>3750143000</beginTime>
    <endTime>5549485000</endTime>
    <firstBlock>898</firstBlock>
    <lastBlock>1347</lastBlock>
  </epoch>
</epochs>

然而,直接访问标签会返回一个空列表:

import xml.etree.ElementTree as ET
tree = ET.parse(r'epochs.xml')
epoch_list=tree.findall("epoch")

但是,循环通过 tree 确实会返回 endTime 值。

import xml.etree.ElementTree as ET
tree = ET.parse(r'epochs.xml')

for elem in tree:
    for subelem in elem:
        print(subelem.text)

我可以知道如何直接检索值为 300937000endTime 吗?

【问题讨论】:

标签: python html xml parsing elementtree


【解决方案1】:

您的代码失败的原因是您的 XML 使用了默认命名空间 (xmlns="http://...")。

但是您对 findall 的调用包含 epoch 没有任何命名空间,所以它不是 可能会找到任何东西。

要处理命名空间 XML,您必须:

  • 创建一个使用过的命名空间的字典({prefix: namespace}),
  • 在 XPath 表达式中包含相关命名空间的前缀,
  • 将上述字典作为findall的第二个参数传递。

类似:

ns = {'ep': 'http://www.egi.com/epochs_mff'}
epoch_list = tree.findall('ep:epoch', ns)

那么结果是:

[<Element '{http://www.egi.com/epochs_mff}epoch' at 0x...>]

如果你不关心,要获取你的 endTime 元素的内容 XML 树中的任何中间元素,运行:

tree.findtext('.//ep:endTime', namespaces=ns)

其他选择是传递完整的 XML 路径,从内容开始 根元素,但请记住每一步的命名空间前缀:

tree.findtext('ep:epoch/ep:endTime', namespaces=ns)

如果您有 多个 endTime 元素,可能的解决方案之一 就是循环处理它们。

这一次 findtext 没用,因为它只找到第一个匹配的元素。 您应该使用基于 findall 的循环,然后(在循环内) 检索当前元素的文本并按预期使用它, 例如:

for it in tree.findall('ep:epoch/ep:endTime', namespaces=ns):
    print(it.text)

当然,将 print 替换为您需要使用的任何内容 找到文本。

【讨论】:

  • 感谢@Valdi_Bo 的详细解释。只是为了进一步扩展讨论。如果存在两个以上的endTime 实例,如何循环tree.findtext('ep:epoch/ep:endTime', namespaces=ns)
猜你喜欢
  • 2017-09-18
  • 2014-11-29
  • 1970-01-01
  • 2016-01-10
  • 2016-09-17
  • 2019-06-17
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多