Возможно ли при редактировании в lxml сохранить декларацию как в исходном файле?
Заголовок моей модели в виде xml выглядит следующим образом:
<?xml version="1.0" standalone="yes"?>
<!-- Generated by BEAUTi v1.10.4 Prerelease #bc6cbd9 -->
<!-- by Alexei J. Drummond, Andrew Rambaut and Marc A. Suchard -->
<!-- Department of Computer Science, University of Auckland and -->
<!-- Institute of Evolutionary Biology, University of Edinburgh -->
<!-- David Geffen School of Medicine, University of California, Los Angeles-->
<!-- http://beast.community/ -->
<beast version="1.10.4">
Я написал ряд скриптов для её автоматического редактирования, и мне хотелось бы, что бы те элементы файла, которые я не был намерен редактировать, оставались неизменными. И вот тут возникают проблемы.
from lxml import etree as ET
parser = ET.XMLParser(encoding="UTF-8")
beast_model = ET.parse(TARGET_PATH, parser)
beast_model.write(
TARGET_PATH,
method="c14n",
)
Выше лежащий код сохраняет всё как есть, кроме самой первой строчки. Тут можно было бы поставить два костылика:
- Заменить метод
writeна функциюtostringи просто соединить строки, а затем записать как обычный файл. Но этот подход имеет ряд минусов: питоновская запись медленнее, чем сишная вlxml, нельзя сразу же сжать файл в архив, да и лишние строки кода выглядят не очень; - Изменить уже записанный файл, но это имеет всё те же минусы.
from lxml import etree as ET
parser = ET.XMLParser(encoding="UTF-8")
beast_model = ET.parse(TARGET_PATH, parser)
beast_model.write(
TARGET_PATH,
encoding="UTF-8",
standalone=True,
)
Составление собственной декларации как выше приводит к следующим результатам:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<!-- Generated by BEAUTi v1.10.4 Prerelease #bc6cbd9 --><!-- by Alexei J. Drummond, Andrew Rambaut and Marc A. Suchard --><!-- Department of Computer Science, University of Auckland and --><!-- Institute of Evolutionary Biology, University of Edinburgh --><!-- David Geffen School of Medicine, University of California, Los Angeles--><!-- http://beast.community/ --><beast version="1.10.4">
Есть какой-то способ её просто не трогать и записать только то, что я редактировал?
Ответы (1 шт):
Автор решения: Yitzhak Khabinsky
→ Ссылка
Лучше использовать XSLT.
Онo имеет <xsl:output .../> для управления сериализацией XML. И его объявление что будет в прологе .
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" standalone="yes"/>