Порядок установки атрибутов дерева элементов
Я пытаюсь написать скрипт Python для стандартизации общих файлов XML, используемых для настройки веб-сайтов и форм веб-сайтов. Однако, чтобы сделать это, я хотел бы либо сохранить исходный порядок атрибутов элементов, либо даже лучше изменить их заранее определенным образом. В настоящее время большинство анализаторов xml, которые я пытался переписать, чтобы порядок атрибутов был буквенно-цифровым. Поскольку эти XML-файлы предназначены для чтения / записи и поддержки, это не слишком полезно.
Например, общий элемент может выглядеть следующим образом в XML;
<Question QuestionRef="XXXXX" DataType="Integer" Text="Question Text" Availability="Shown" DefaultAnswer="X">
Однако после прохождения через elementtree и перезаписи в новый файл это изменяется на:
<Question Availability="Shown" DataType="Integer" DefaultAnswer="X" PartType="X" QuestionRef="XXXXX" Text="Question Text">
Поскольку целью сценария является стандартизация большого количества файлов XML для повышения читабельности между коллегами и того, что информация, содержащаяся в атрибутах элемента, имеет различные уровни значимости (например, QuestionRef очень важен), диктует, что атрибуты должны быть разумно заказанным.
Я понимаю, что запросы Python (в которых хранятся атрибуты) естественным образом неупорядочены, а упорядоченность атрибутов в состояниях спецификации XML незначительна, но этот фактор читабельности человека является движущей силой сценария.
В других вопросах (по переполнению стека), похожих на этот, я заметил, что pxdom может сделать это (ссылка на вопрос: ссылка), но я не могу найти упоминания о том, как это можно сделать в документации pxdom или с помощью поиска Google, Так есть ли способ поддерживать порядок атрибутов или определять его с помощью текущих анализаторов XML? Желательно не прибегая к hotpatching:)!
Буду очень признателен за любую помощь, которую может оказать:).
1 ответ
Примените патч обезьяны, как указано ниже:
в ElementTree.py
файл, есть функция с именем _serialize_xml
;
в этой функции; примените нижеупомянутый патч;
##for k, v in sorted(items): # remove the sorted here
for k, v in items:
if isinstance(k, QName):
k = k.text
if isinstance(v, QName):
v = qnames[v.text]
else:
v = _escape_attrib(v, encoding)
write(" %s=\"%s\"" % (qnames[k], v))
Вот; удалить sorted(items)
и сделать это просто items
как я сделал выше.
Также отключить сортировку на основе пространства имен (потому что в вышеприведенном патче; сортировка все еще присутствует, когда пространство имен присутствует для атрибута xml; в противном случае, если пространство имен отсутствует; тогда выше работает нормально); чтобы сделать это, заменить все {}
с collections.OrderedDict()
от ElementTree.py
Теперь у вас есть все атрибуты в порядке, поскольку вы добавили их в этот элемент xml.
Прежде чем делать все вышеперечисленное; прочитайте сообщение об авторских правах Фредрика Лунда, которое присутствует в ElementTree.py