2

私はしようとしています:

- read a KML file
- remove the Placemark element if name = 'ZONE'
- write a new KML file without the element

これは私のコードです:

from pykml import parser
kml_file_path = '../Source/Lombardia.kml'

removeList = list()

with open(kml_file_path) as f:
 folder = parser.parse(f).getroot().Document.Folder

for pm in folder.Placemark:
    if pm.name == 'ZONE':
        removeList.append(pm)
        print pm.name

for tag in removeList:
    parent = tag.getparent()
    parent.remove(tag)
#Write the new file
#I cannot reach the solution help me

これが KML です。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<Document>
    <name>Lombardia</name>
    <Style>
    ...
    </Style>
    <Folder>
<Placemark>
            <name>ZOGNO</name>
            <styleUrl>#FEATURES_LABELS</styleUrl>
            <Point>
                <coordinates>9.680530595139061,45.7941656233647,0</coordinates>
            </Point>
        </Placemark>
        <Placemark>
            <name>ZONE</name>
            <styleUrl>#FEATURES_LABELS</styleUrl>
            <Point>
                <coordinates>10.1315885854064,45.7592449779275,0</coordinates>
            </Point>
        </Placemark>
    </Folder>
</Document>
</kml>

問題は、新しい KML ファイルを作成したときに、削除したい要素がまだ残っていることです。実は、name=ZONE を含む要素を削除したいのです。私が間違っているのは何ですか?ありがとうございました。

--- 最終的なコード これは、@Dawid Ferenczy のおかげで機能するコードです。

from lxml import etree
import pykml
from pykml import parser

kml_file_path = '../Source/Lombardia.kml'

# parse the input file into an object tree
with open(kml_file_path) as f:
  tree = parser.parse(f)

# get a reference to the "Document.Folder" node
folder = tree.getroot().Document.Folder

# iterate through all "Document.Folder.Placemark" nodes and find and remove all nodes
# which contain child node "name" with content "ZONE"
for pm in folder.Placemark:
    if pm.name == 'ZOGNO':
        parent = pm.getparent()
        parent.remove(pm)

# convert the object tree into a string and write it into an output file
with open('output.kml', 'w') as output:
    output.write(etree.tostring(folder, pretty_print=True))
4

2 に答える 2

1

コードに次の問題があります。

  • 解析されたオブジェクト ツリー全体をどこにも保存していません (ノード " Document.Folder ":への参照だけがありfolder = parser.parse(f).getroot().Document.Folderます) が、それをファイルに書き戻したいので、保存する必要があります。
  • removeList最初のループで要素を直接削除できるのに、2 つのループとリストが必要な理由がわかりません
  • あなたはドキュメントを読んでいません-pykmlライブラリのドキュメントの例の下で、オブジェクトツリーをファイルに書き込む方法がよく説明されています

次のコードを試してください。

from lxml import etree
from pykml import parser

kml_file_path = './input.kml'

# parse the input file into an object tree
with open(kml_file_path) as f:
  tree = parser.parse(f)

# get a reference to the "Document.Folder" node
folder = tree.getroot().Document.Folder

# iterate through all "Document.Folder.Placemark" nodes and find and remove all nodes 
# which contain child node "name" with content "ZONE"
for pm in folder.Placemark:
    if pm.name == 'ZONE':
        parent = pm.getparent()
        parent.remove(pm)

# convert the object tree into a string and write it into an output file
with open('output.kml', 'w') as output:
    output.write(etree.tostring(tree, pretty_print=True))

とても簡単です:

  • KML ファイルはオブジェクト ツリーに解析され、変数に格納されますtree
  • 同じオブジェクト ツリーが直接操作されている (削除された要素)
  • 同じオブジェクト ツリーがファイルに書き戻されます。
于 2018-08-10T15:53:00.393 に答える