Порядок установки атрибутов дерева элементов

Я пытаюсь написать скрипт 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

Другие вопросы по тегам