使用Python ElementTree库解析KML/XML中SimpleData标签的name属性值
解决方案
你原有代码的XPath路径中包含Folder层级,若实际KML文件里Placemark节点并不嵌套在Folder节点下,该查询会返回空列表。另外绝大多数标准KML都带有默认命名空间,查询时如果忽略命名空间也会无法匹配到节点。
无命名空间场景实现代码
如果你的KML/XML没有定义默认命名空间,可以直接用通用路径查询,不需要关心上层节点层级:
import xml.etree.ElementTree as ET # 加载KML/XML文件 tree = ET.parse('你的文件路径.kml') root = tree.getroot() # 查找所有name属性为ID2的SimpleData节点 id2_nodes = root.findall(".//SimpleData[@name='ID2']") # 提取对应值 for node in id2_nodes: id2_value = node.text print(id2_value)
带命名空间场景实现代码(适用绝大多数标准KML)
标准KML默认携带命名空间http://www.opengis.net/kml/2.2,需要在查询时指定命名空间:
import xml.etree.ElementTree as ET # 定义KML命名空间 ns = {'kml': 'http://www.opengis.net/kml/2.2'} tree = ET.parse('你的文件路径.kml') root = tree.getroot() # 标签前增加自定义的命名空间前缀即可匹配 id2_nodes = root.findall(".//kml:SimpleData[@name='ID2']", namespaces=ns) for node in id2_nodes: print(node.text)
如果确认你的节点路径为Folder/Placemark/ExtendedData/SchemaData/SimpleData,带命名空间的全路径写法如下:
temp = root.findall(".//kml:Folder/kml:Placemark/kml:ExtendedData/kml:SchemaData/kml:SimpleData[@name='ID2']", namespaces=ns)
内容的提问来源于stack exchange,提问作者Skryt101
相关产品推荐
相关产品推荐

