Из документа XML я хочу сохранить один узел в файле - со всеми родительскими узлами, но без каких-либо дочерних узлов. Например, для следующего XML:Сохранить (распечатать) узел 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>
ожидается выход для <Document>
узла будет выглядеть следующим образом:
<?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-оборудования для столь простой задачи будет немного переборщить :) Но я буду считать, спасибо за ваш ответ! –
Обратите внимание, что другие XML-модификации могут обрабатываться в одном скрипте XSLT в дополнение к удалению узлов. И вы можете встроить XSLT внутри Python вместо внешнего файла. Кроме того, файл переносится на другие языки и исполняемые файлы (Java, PHP, C#, VBA, Saxon, Xalan). Конечно, масштабируемый ответ! Если это поможет, пожалуйста, подтвердите разрешение. – Parfait