我想利用 ElementTree python 库解析 SimpleData 标签中找到的“ID2”名称属性。
<Placemark>
<ExtendedData>
<SchemaData>
<SimpleData name="ID1">123456</SimpleData>
<SimpleData name="ID2">111111</SimpleData>
</SchemaData>
</ExtendedData>
</Placemark>
我一直在尝试类似的事情
temp=root.findall(".//Folder/Placemark/ExtendedData/SchemaData/SimpleData[@name='ID2']")
我在堆栈溢出中发现的所有内容都不包括“名称”示例中的对象。
如果 XML 使用命名空间,则必须在 XPath 表达式中指定命名空间。
XPath 表达式可以将显式命名空间作为元素名称的一部分。
elems = root.find("{http://www.opengis.net/kml/2.2}Placemark")
或者,find()、findall() 和 iterfind() 函数可以将显式命名空间字典对象作为第二个参数,并且 XPath 可以使用命名空间前缀。这使得表达式更加紧凑且更易于阅读。
namespaces = {'kml': 'http://www.opengis.net/kml/2.2'}
elems = root.find('kml:Placemark', namespaces)
尝试:
import xml.etree.ElementTree as ET
data = '''<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Folder>
<Placemark>
<ExtendedData>
<SchemaData>
<SimpleData name="ID1">123456</SimpleData>
<SimpleData name="ID2">111111</SimpleData>
</SchemaData>
</ExtendedData>
</Placemark>
</Folder>
</kml>'''
namespaces = {'kml': 'http://www.opengis.net/kml/2.2'} # add more as needed
# uncomment to load data from file
#tree = ET.parse('simpledata.kml')
#root = tree.getroot()
root = ET.fromstring(data)
xpath = ".//kml:Placemark/kml:ExtendedData/kml:SchemaData/kml:SimpleData[@name='ID2']"
for elem in root.findall(xpath, namespaces):
print("ID2=", elem.text)
输出:
ID2=111111
请参阅 ElementTree 文档的使用命名空间解析 XML 部分。