PyKML:将地标附加到多个KML文档

时间:2015-04-21 14:57:22

标签: python lxml kml elementtree

我正在使用PyKML创建几个KML文件,并且遇到了一些我希望有人可以解释的奇怪行为。以下是重现问题:

from lxml import etree
from pykml.factory import KML_ElementMaker as KML

doc1 = KML.kml(KML.Document())
doc2 = KML.kml(KML.Document())

p = KML.Placemark()

doc1.Document.append(p)
doc2.Document.append(p)

print etree.tostring(etree.ElementTree(doc1),pretty_print=True)
print etree.tostring(etree.ElementTree(doc2),pretty_print=True)

这是输出:

<kml xmlns:gx="http://www.google.com/kml/ext/2.2"    xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://www.opengis.net/kml/2.2">
  <Document/>
</kml>

<kml xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://www.opengis.net/kml/2.2">
  <Document>
    <Placemark/>
  </Document>
</kml>

地点标记显示在第二个文档中,但不显示在第一个文档中。 就好像地标一次只能附加到一个文件中。

如果按照以下方式重新安排最后几行,那么事情就会奏效。

doc1.Document.append(p)
print etree.tostring(etree.ElementTree(doc1),pretty_print=True)

doc2.Document.append(p)
print etree.tostring(etree.ElementTree(doc2),pretty_print=True)

和输出:

<kml xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://www.opengis.net/kml/2.2">
  <Document>
    <Placemark/>
  </Document>
</kml>

<kml xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://www.opengis.net/kml/2.2">
  <Document>
    <Placemark/>
  </Document>
</kml>

但这需要对我的代码进行重大调整,我希望避免这种情况。

我怀疑我遗漏了一些关于PyKML,lxmlelementtree甚至Python如何运作的基本信息。有人可以解释一下这里可能会发生什么吗?

1 个答案:

答案 0 :(得分:1)

(部分答案 - 仍然希望得到解释!)

如果我这样做:

from copy import deepcopy
doc1.Document.append(deepcopy(p))
doc2.Document.append(deepcopy(p))
事情有效。但是,etree.tostring对输入对象doc1doc2做了什么?就好像他们被某种方式改变了一样。