Напишите ElementTree как канонизированный XML (c14n)
Класс ElementTree в Питоне xml.etree
API имеет write()
метод, который документирует необязательный method
аргумент:
*method* -- either "xml" (default), "html, "text", or "c14n"
По крайней мере, с Python 3.5 (на Fedora 25) просто пишу с помощью этого метода
import xml.etree.ElementTree as ET
# ... create some elements ...
tree = ET.ElementTree(root)
tree.write(filename, method='c14n')
просто бросает ValueError:
File "/usr/lib64/python3.5/xml/etree/ElementTree.py", line 751, in write
raise ValueError("unknown method %r" % method)
ValueError: unknown method 'c14n'
И код ElementTree содержит эту заметку:
_serialize = {
"xml": _serialize_xml,
"html": _serialize_html,
"text": _serialize_text,
# this optional method is imported at the end of the module
# "c14n": _serialize_c14n,
}
Что это должно означать, точно?
Как сериализовать ElementTree в XML-файл c14n на Python?
1 ответ
Сериализация C14N была когда-либо реализована только как экспериментальное расширение оригинальной автономной библиотеки ElementTree, разработанной Фредриком Лундом, и никогда не была частью официального выпуска.
Когда ветка 1.3 библиотеки была импортирована в стандартную библиотеку Python, код поддержки для дополнительной библиотеки был включен, но сериализация C14N никогда не была. Позже код импорта необязательного компонента был полностью удален, но несколько упоминаний о C14N остаются в коде. Однако в документации никогда не упоминается C14N, а оставшиеся упоминания следует просто удалить из Python.
Однако, если вы должны заставить его работать, вы всегда можете скачать оригинал ElementC14N.py
модуль и обновите его для работы с текущей библиотекой ElementTree. Это требует некоторой работы; кодовая база специфична для Python 2 и должна будет быть обновлена для обработки Unicode.