使用ElementTree无法定位GPX XML中的time元素求协助
解决GPX XML文件中
<time>元素查找失败的问题 这个问题我碰到过!原因很简单——你的GPX XML文件带命名空间,而xml.etree.ElementTree的findall默认不会处理带命名空间的元素,所以才找不到那些<time>标签。
问题根源
看你的GPX根元素:
<gpx xmlns="http://www.topografix.com/GPX/1/1" version="1.1" creator="https://github.com/juanirache/gopro-telemetry">
这里的xmlns="http://www.topografix.com/GPX/1/1"意味着所有子元素(包括<time>)都属于这个命名空间。你原来的代码.//time是在查找没有命名空间的<time>元素,自然匹配不到目标内容。
解决方案
下面提供两种可行的解决方法:
方法1:显式指定命名空间映射
直接在查找时带上命名空间前缀,是最规范的做法:
import xml.etree.ElementTree as ET tree = ET.parse('sample 1.xml') root = tree.getroot() # 定义GPX的命名空间字典 ns = {'gpx': 'http://www.topografix.com/GPX/1/1'} # 使用命名空间前缀查找time元素 for x in root.findall('.//gpx:time', ns): print(x.text)
方法2:忽略命名空间(快速适配)
如果你不想处理命名空间的细节,可以用XPath的local-name()函数匹配元素名,不管它属于哪个命名空间:
import xml.etree.ElementTree as ET tree = ET.parse('sample 1.xml') root = tree.getroot() # 匹配所有local-name为time的元素 for x in root.findall('.//*[local-name()="time"]'): print(x.text)
两种方法都能正常输出你需要的时间字符串,比如2020-12-10T19:45:20.370Z这类内容。
内容的提问来源于stack exchange,提问作者Jakub Kasal
相关产品推荐
相关产品推荐

