Возможно ли при редактировании в 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",
)

Выше лежащий код сохраняет всё как есть, кроме самой первой строчки. Тут можно было бы поставить два костылика:

  1. Заменить метод write на функцию tostring и просто соединить строки, а затем записать как обычный файл. Но этот подход имеет ряд минусов: питоновская запись медленнее, чем сишная в lxml, нельзя сразу же сжать файл в архив, да и лишние строки кода выглядят не очень;
  2. Изменить уже записанный файл, но это имеет всё те же минусы.
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"/>
→ Ссылка