从 KML 中删除元素 (Python)

问题描述

我使用 Python 的 simplekml 库和以下脚本生成一个 KML 文件,其输出也如下所示:

import simplekml
kml = simplekml.Kml()
ground = kml.newgroundoverlay(name='Aerial Extent')
ground.icon.href = 'C:\\Users\\mdl518\\Desktop\\aerial_image.png'
ground.latlonBox.north = 46.55537
ground.latlonBox.south = 46.53134
ground.latlonBox.east = 48.60005
ground.latlonBox.west = 48.57678
ground.latlonBox.rotation = 0.090320 
kml.save(".//aerial_extent.kml")

输出 KML:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
    <Document id="1">
        <GroundOverlay id="2">
            <name>Aerial Extent</name>
            <Icon id="3">
                <href>C:\\Users\\mdl518\\Desktop\\aerial_image.png</href>
            </Icon>
            <LatLonBox>
                <north>46.55537</north>
                <south>46.53134</south>
                <east>48.60005</east>
                <west>48.57678</west>
                <rotation>0.090320</rotation>
        </LatLonBox>
    </GroundOverlay>
</Document>

但是,我试图从此 KML 中删除“文档”标记,因为它是使用 simplekml 生成认元素,同时保留子元素(例如 GroundOverlay)。此外,有没有办法删除与特定元素(即 GroundOverlay、Icon 元素)关联的“id”属性?我正在探索使用 ElementTree/lxml 来实现这一点,但这些似乎更特定于 XML 文件而不是 KML。这是我试图用来修改 KML,但无法删除 Document 元素的内容

from lxml import etree
tree = etree.fromstring(open("C:\\Users\\mdl518\\Desktop\\aerial_extent.kml").read())
for item in tree.xpath("//Document[@id='1']"):
    item.getparent().remove(item)

print(etree.tostring(tree,pretty_print=True))

这是最终所需的输出 XML:

<?xml version="1.0" encoding="UTF-8"?>

<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
    <GroundOverlay>
         <name>Aerial Extent</name>
         <Icon>
             <href>C:\\Users\\mdl518\\Desktop\\aerial_image.png</href>
         </Icon>
         <LatLonBox>
              <north>46.55537</north>
              <south>46.53134</south>
              <east>48.60005</east>
              <west>48.57678</west>
              <rotation>0.090320</rotation>
         </LatLonBox>
    </GroundOverlay>
</kml>

非常感谢任何见解!

解决方法

你被可怕的命名空间绊倒了...

尝试使用这样的东西:

ns = {'kml': 'http://www.opengis.net/kml/2.2'}
for item in tree.xpath("//kml:Document[@id='1']",namespaces=ns):
    item.getparent().remove(item)

编辑:

要仅删除父级并保留其所有后代,请尝试以下操作:

retain = doc.xpath("//kml:Document[@id='1']/kml:GroundOverlay",namespaces=ns)[0]
for item in doc.xpath("//kml:Document[@id='1']",namespaces=ns):
    anchor = item.getparent()
    anchor.remove(item)
    anchor.insert(1,retain)

print(etree.tostring(doc,pretty_print=True).decode())

这应该会得到你想要的输出。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...