使用 ElementTree 库解析 KML/XML

问题描述 投票:0回答:1

我想利用 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']")

我在堆栈溢出中发现的所有内容都不包括“名称”示例中的对象。

python xml parsing kml elementtree
1个回答
3
投票

如果 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 部分。

© www.soinside.com 2019 - 2024. All rights reserved.