提问者:小点点

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


其思想是获取以下xml的标记endtime的值:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<epochs xmlns="http://www.egi.com/epochs_mff" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <epoch>
        <beginTime>0</beginTime>
        <endTime>300937000</endTime>
        <firstBlock>1</firstBlock>
        <lastBlock>76</lastBlock>
    </epoch>
</epochs>

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

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

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

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

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

请问如何直接检索值为300937000的endtime


共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...>]

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

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

另一种选择是传递完整的XML路径,从根元素的内容开始,但要记住每个步骤中的名称空间前缀:

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