Python 元素树不';t加载Google Earth导出的KML
我有一个与Google Earth导出的KML相关的问题,因为它似乎不能很好地与元素树一起工作。我不知道问题出在哪里,所以我会解释我是如何做每件事的 以下是相关代码:Python 元素树不';t加载Google Earth导出的KML,python,xml,kml,elementtree,Python,Xml,Kml,Elementtree,我有一个与Google Earth导出的KML相关的问题,因为它似乎不能很好地与元素树一起工作。我不知道问题出在哪里,所以我会解释我是如何做每件事的 以下是相关代码: kmlFile = open( filePath, 'r' ).read( -1 ) # read the whole file as text kmlFile = kmlFile.replace( 'gx:', 'gx' ) # we need this as otherwise the Element Tr
kmlFile = open( filePath, 'r' ).read( -1 ) # read the whole file as text
kmlFile = kmlFile.replace( 'gx:', 'gx' ) # we need this as otherwise the Element Tree parser
# will give an error
kmlData = ET.fromstring( kmlFile )
document = kmlData.find( 'Document' )
有了这段代码,ET(元素树对象)创建了一个可以通过变量kmlData访问的元素对象。它指向根元素('kml'标记)。但是,当我搜索子元素“Document”时,它返回None。尽管KML文件中存在“Document”标记
除了“gx:smth”标记之外,KML和XMLs之间还有其他差异吗?我已经搜索了我正在处理的KML文件,没有发现任何可疑之处。以下是程序应该处理的KML文件的简化结构:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<Document>
<name>UK.kmz</name>
<Style id="sh_blu-blank">
<IconStyle>
<scale>1.3</scale>
<Icon>
<href>http://maps.google.com/mapfiles/kml/paddle/blu-blank.png</href>
</Icon>
<hotSpot x="32" y="1" xunits="pixels" yunits="pixels"/>
</IconStyle>
<ListStyle>
<ItemIcon>
<href>http://maps.google.com/mapfiles/kml/paddle/blu-blank-lv.png</href>
</ItemIcon>
</ListStyle>
</Style>
[other style tags...]
<Folder>
<name>UK</name>
<Placemark>
<name>1262 Crossness Pumping Station</name>
<LookAt>
<longitude>0.1329926667038817</longitude>
<latitude>51.50303535104574</latitude>
<altitude>0</altitude>
<range>4246.539753518848</range>
<tilt>0</tilt>
<heading>-4.295161152207489</heading>
<altitudeMode>relativeToGround</altitudeMode>
<gx:altitudeMode>relativeToSeaFloor</gx:altitudeMode>
</LookAt>
<styleUrl>#msn_blu-blank15000</styleUrl>
<Point>
<coordinates>0.1389579668507301,51.50888923518947,0</coordinates>
</Point>
</Placemark>
[other placemark tags...]
</Folder>
</Document>
</kml>
UK.kmz
1.3
http://maps.google.com/mapfiles/kml/paddle/blu-blank.png
http://maps.google.com/mapfiles/kml/paddle/blu-blank-lv.png
[其他样式标记…]
英国
1262十字泵站
0.1329926667038817
51.50303535104574
0
4246.539753518848
0
-4.295161152207489
相对地
相对海底
#msn_蓝光15000
0.1389579668507301,51.50888923518947,0
[其他位置标记标签…]
你知道为什么我不能访问“kml”的任何子元素吗?顺便说一下,Python版本是2.7。KML文档位于
http://earth.google.com/kml/2.2
名称空间,如所示
<kml xmlns="http://earth.google.com/kml/2.2">
你需要这个:
document = kmlData.find('{http://earth.google.com/kml/2.2}Document')
但是,XML文件有一个问题。有一个元素叫做gx:altitudeMode
。gx
位是名称空间前缀。需要声明这样的前缀,但缺少声明
您只需将gx:
替换为gx
即可解决此问题。但正确的方法是添加名称空间声明。基于,我认为gx
与http://www.google.com/kml/ext/2.2
名称空间。因此,要使文档格式良好,根元素的开始标记应为
<kml xmlns="http://earth.google.com/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
现在可以解析文档:
In [1]: from xml.etree import ElementTree as ET
In [2]: kmlData = ET.parse("kml2.xml")
In [3]: document = kmlData.find('{http://earth.google.com/kml/2.2}Document')
In [4]: document
Out[4]: <Element '{http://earth.google.com/kml/2.2}Document' at 0x1895810>
In [5]:
[1]中的:从xml.etree导入ElementTree作为ET
在[2]中:kmlData=ET.parse(“kml2.xml”)
在[3]中:document=kmlData.find('{http://earth.google.com/kml/2.2}文件')
在[4]中:文件
出[4]:
在[5]中:
KML文档位于http://earth.google.com/kml/2.2
名称空间,如所示
<kml xmlns="http://earth.google.com/kml/2.2">
你需要这个:
document = kmlData.find('{http://earth.google.com/kml/2.2}Document')
但是,XML文件有一个问题。有一个元素叫做gx:altitudeMode
。gx
位是名称空间前缀。需要声明这样的前缀,但缺少声明
您只需将gx:
替换为gx
即可解决此问题。但正确的方法是添加名称空间声明。基于,我认为gx
与http://www.google.com/kml/ext/2.2
名称空间。因此,要使文档格式良好,根元素的开始标记应为
<kml xmlns="http://earth.google.com/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
现在可以解析文档:
In [1]: from xml.etree import ElementTree as ET
In [2]: kmlData = ET.parse("kml2.xml")
In [3]: document = kmlData.find('{http://earth.google.com/kml/2.2}Document')
In [4]: document
Out[4]: <Element '{http://earth.google.com/kml/2.2}Document' at 0x1895810>
In [5]:
[1]中的:从xml.etree导入ElementTree作为ET
在[2]中:kmlData=ET.parse(“kml2.xml”)
在[3]中:document=kmlData.find('{http://earth.google.com/kml/2.2}文件')
在[4]中:文件
出[4]:
在[5]中:
这个问题很愚蠢,因为我对XML不太熟悉。我已经对名称空间进行了一些探索,类似于您所说的一些方法很有效。。。然而,我后来决定在处理XML之前,简单地从XML中删除与名称空间有关的任何内容,因为我需要提取的数据非常简单,并且不在任何奇怪的名称空间下。“正确”的解决问题的方法在我的情况下不值得付出努力,我会说。。。但是谢谢!不客气。如果您想进一步探索XML名称空间,这可能很有用:。官方的ElementTree文档()没有对这个主题做太多的说明,这个问题很愚蠢,因为我对XML不太熟悉。我已经对名称空间进行了一些探索,类似于您所说的一些方法很有效。。。然而,我后来决定在处理XML之前,简单地从XML中删除与名称空间有关的任何内容,因为我需要提取的数据非常简单,并且不在任何奇怪的名称空间下。“正确”的解决问题的方法在我的情况下不值得付出努力,我会说。。。但是谢谢!不客气。如果您想进一步探索XML名称空间,这可能很有用:。官方的ElementTree文档()没有对这个主题做太多的说明。