我遇到与Google地球导出的KML相关的问题,因为它似乎与Element Tree不兼容。我不知道问题可能在哪里,所以我将解释我是如何做的。
以下是相关代码:
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访问的Element对象。它指向根元素('kml'标记)。但是,当我搜索子元素“Document”时,它返回None。虽然KML文件中存在'Document'标签!
除了'gx:smth'标签之外,KML和XML之间是否还有其他差异?我搜索了我正在处理的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>
您是否知道为什么我无法访问'kml'的任何子元素?顺便说一句,Python版本是2.7。
答案 0 :(得分:1)
KML文档位于http://earth.google.com/kml/2.2
命名空间中,如
<kml xmlns="http://earth.google.com/kml/2.2">
这意味着Document
元素的名称实际上是{http://earth.google.com/kml/2.2}Document
。
而不是:
document = kmlData.find('Document')
你需要这个:
document = kmlData.find('{http://earth.google.com/kml/2.2}Document')
但是,XML文件存在问题。有一个名为gx:altitudeMode
的元素。 gx
位是名称空间前缀。需要声明这样的前缀,但缺少声明。
您只需将gx:
替换为gx
即可解决此问题。但是,执行此操作的正确方法是添加名称空间声明。根据{{3}},我认为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]: