其思想是获取以下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
?
代码失败的原因是XML使用了默认命名空间(xmlns=“http://。。。”)。
但是您对findall的调用包含没有任何名称空间的epoch,因此它不太可能找到任何东西。
要处理命名空间XML,必须:
类似于:
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)