Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 元素树不';t加载Google Earth导出的KML_Python_Xml_Kml_Elementtree - Fatal编程技术网

Python 元素树不';t加载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

我有一个与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 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文档()没有对这个主题做太多的说明。