0
XML文書から、1つのノードをすべての親ノードでファイルに保存したいが、子ノードは付けない。たとえば、次のXMLのために:<Document>
ノード用xmlノードをその親であるが子は持たないで保存する
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document id="myid">
<name>ref.kml</name>
<Style id="normalState">
<IconStyle><scale>1.0</scale><Icon><href>yt.png</href></Icon></IconStyle>
</Style>
</Document>
</kml>
期待される出力は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document id="myid">
</Document>
</kml>
これまでのところ私は保存する前に、すべての子要素の反復除去しながら解決策を見つけました。しかし、元のXMLを使って作業する必要があるため、文書全体をコピーする必要があります。
#!/usr/bin/env python
import lxml.etree as ET # have to use [lxml] because [xml] doesn't support 'xml_declaration'
import copy
kml_file = ET.parse("myfile.kml")
kml_copied = copy.deepcopy(kml_file) # .copy() is not enough, need .deepcopy()
root = kml_copied.getroot()
my_node = root[0]
for child in my_node:
my_node.remove(child)
print ET.tostring(kml_copied, xml_declaration=True, encoding='utf-8')
これを行うより良い方法はありますか?少なくとも文書全体のディープコピーを避けるために...
私は、XSLTマシンを非常に単純なタスクで起動すると少し残酷になると思っていました:)しかし、私はあなたの答えをありがとう! –
ノードの削除に加えて、同じXSLTスクリプトで他のXML変更を処理できることに注意してください。また、外部ファイルの代わりにPythonの内部にXSLTを埋め込むこともできます。さらに、ファイルは他の言語や実行ファイル(Java、PHP、C#、VBA、Saxon、Xalan)に移植可能です。確かに、スケーラブルな答え!お手数ですが、解決をご確認ください。 – Parfait