如何在python中将kml文件解析为树结构?

如何在python中将kml文件解析为树结构?,python,kml,elementtree,Python,Kml,Elementtree,我有一个kml文件,我正试图用python解析它,我想要的是从SimpleData传递val3 作为一个参数,将只检索该placemark标记的坐标,我以前使用过xpath: xpath表达式中的一个典型示例是: value = '..' for val in (//Placement/ExtendedData/SimpleData[contains(text(), "+value+")]): print val.find_element_by_xpath(//coordinates)

我有一个kml文件,我正试图用python解析它,我想要的是从SimpleData传递val3 作为一个参数,将只检索该placemark标记的坐标,我以前使用过xpath: xpath表达式中的一个典型示例是:

value = '..'
for val in (//Placement/ExtendedData/SimpleData[contains(text(), "+value+")]):
    print val.find_element_by_xpath(//coordinates)
但是,我似乎无法通过在Python中使用元素树获得相同的结果:

这是kml文件

<?xml version="1.0" encoding="utf-8" ?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document id="root_doc">
<Schema name="" id="">
    <SimpleField name="NAME_0" type="string"></SimpleField>
    <SimpleField name="NAME_1" type="string"></SimpleField>
</Schema>
<Folder><name></name>
  <Placemark>
    <Style><LineStyle><color>ff0000ff</color></LineStyle><PolyStyle><fill>0</fill></PolyStyle></Style>
    <ExtendedData><SchemaData schemaUrl="#gadm36_IND_3">
        <SimpleData name="NAME_0">val1</SimpleData>
        <SimpleData name="NAME_1">val2</SimpleData>
        <SimpleData name="NAME_2">val3</SimpleData>
    </SchemaData></ExtendedData>
      <MultiGeometry><Polygon><outerBoundaryIs><LinearRing><coordinates>92.7877807617189,9.24416637420654 92.7888870239258,9.24305438995361 92.7897186279296,9.24306106567383 92.7902832031251,9.24250030517589 92.7905578613282,9.24250030517589 92.7911148071289,9.24194431304943 92.7913894653321,9.24194431304943 92.7922210693359,9.24110984802257 92.7922210693359,9.24083423614508 92.7930526733399,9.23999977111822
      </coordinates></LinearRing>...
      <Placemark>
    <Style><LineStyle><color>ff0000ff</color></LineStyle><PolyStyle><fill>0</fill></PolyStyle></Style>
    <ExtendedData><SchemaData schemaUrl="#gadm36_IND_3">
        <SimpleData name="NAME_0">val1</SimpleData>
        <SimpleData name="NAME_1">val2</SimpleData>
        <SimpleData name="NAME_2">val3</SimpleData>
    </SchemaData></ExtendedData>
      <MultiGeometry><Polygon><outerBoundaryIs><LinearRing><coordinates>92.7877807617189,9.24416637420654 92.7888870239258,9.24305438995361 92.7897186279296,9.24306106567383 92.7902832031251,9.24250030517589 92.7905578613282,9.24250030517589 92.7911148071289,9.24194431304943 92.7913894653321,9.24194431304943 92.7922210693359,9.24110984802257 92.7922210693359,9.24083423614508 92.7930526733399,9.23999977111822
      </coordinates></LinearRing>...
使用和。在XPath选择器中,您可以使用文本
val3
SimpleData
导航回
Placemark
祖先,然后从那里导航到
坐标

from lxml import etree

tree = etree.parse("so.xml")
nsmap = {"kml": "http://www.opengis.net/kml/2.2"}

listOfCoordinates = tree.xpath("//kml:SimpleData[text()=\"val3\"]/ancestor::kml:Placemark//kml:coordinates", namespaces=nsmap)
print(listOfCoordinates[0].text)
输出:

92.7877807617189,9.24416637420654 92.7888870239258,9.24305438995361 92.7897186279296,9.24306106567383 92.7902832031251,9.24250030517589 92.7905578613282,9.24250030517589 92.7911148071289,9.24194431304943 92.79138
94653321,9.24194431304943 92.7922210693359,9.24110984802257 92.7922210693359,9.24083423614508 92.7930526733399,9.23999977111822
使用和。在XPath选择器中,您可以使用文本
val3
SimpleData
导航回
Placemark
祖先,然后从那里导航到
坐标

from lxml import etree

tree = etree.parse("so.xml")
nsmap = {"kml": "http://www.opengis.net/kml/2.2"}

listOfCoordinates = tree.xpath("//kml:SimpleData[text()=\"val3\"]/ancestor::kml:Placemark//kml:coordinates", namespaces=nsmap)
print(listOfCoordinates[0].text)
输出:

92.7877807617189,9.24416637420654 92.7888870239258,9.24305438995361 92.7897186279296,9.24306106567383 92.7902832031251,9.24250030517589 92.7905578613282,9.24250030517589 92.7911148071289,9.24194431304943 92.79138
94653321,9.24194431304943 92.7922210693359,9.24110984802257 92.7922210693359,9.24083423614508 92.7930526733399,9.23999977111822

“仅检索该placemark标记的坐标”是什么意思?您希望为输入提取哪个元素、属性或文本
val3
?假设我的目标是第一个val3,因此我希望检索第一个val3的placemark的坐标。您所说的“仅检索该placemark标记的坐标”是什么意思?您希望为输入提取哪个元素、属性或文本
val3
?假设我的目标是第一个val3,因此我希望检索第一个val3的坐标。placemark的文本。谢谢,我从哪里获得文档来理解这一点?lxml的文档非常好。只要看看我链接的页面就行了。对于XPath,我将从Wikipedia开始:谢谢,我从哪里可以得到一个文档来理解它?lxml的文档记录得非常好。只要看看我链接的页面就行了。对于XPath,我将从Wikipedia开始: