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

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 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)

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


杨__羊羊
浏览 84回答 1
1回答

蝴蝶不菲

您的代码失败的原因是您的 XML 使用默认命名空间 (&nbsp;xmlns="http://..."&nbsp;)。但是您对findall 的调用包含没有任何名称空间的纪元&nbsp;,因此它不太可能找到任何东西。要处理命名空间的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):&nbsp; &nbsp; print(it.text)当然,将print替换为您需要使用找到的文本的任何内容。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python