为了账号安全,请及时绑定邮箱和手机立即绑定

使用 ElementTree 访问 xml 文件中的元素和标记时获取空列表

使用 ElementTree 访问 xml 文件中的元素和标记时获取空列表

杨__羊羊 2023-03-16 09:29:47
endTime这个想法是获取以下标签的值xml:<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 ETtree = ET.parse(r'epochs.xml')epoch_list=tree.findall("epoch")但是,遍历tree确实会返回endTime值。import xml.etree.ElementTree as ETtree = ET.parse(r'epochs.xml')for elem in tree:    for subelem in elem:        print(subelem.text)我可以知道如何直接检索endTime值为300937000的吗?
查看完整描述

1 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

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

但是您对findall 的调用包含没有任何名称空间的纪元 ,因此它不太可能找到任何东西。

要处理命名空间的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替换为您需要使用找到的文本的任何内容。


查看完整回答
反对 回复 2023-03-16
  • 1 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信