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

2024-09-27 04:18:44 发布

您现在位置:Python中文网/ 问答频道 /正文

其思想是为以下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


Tags: 标记importtreehttpwwwxmletetree
1条回答
网友
1楼 · 发布于 2024-09-27 04:18:44

代码失败的原因是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的循环,然后(在循环内) 检索当前元素的文本并使用它, e、 g:

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

当然,用您需要的任何东西替换打印 找到文本

相关问题 更多 >

    热门问题