Как предотвратить XMLSerializer.serializeToString () от переупорядочения атрибутов? - PullRequest
4 голосов
/ 24 августа 2010

Я использую jQuery для загрузки произвольных строк XML (фрагментов большего документа) в DOM браузера и манипулирования ими, затем использую XMLSerializer для загрузки их обратно в строки и отправки их обратно на сервер, где они обрабатываются ( python и lxml) и повторно интегрированы в полный документ XML.

XML начинается и заканчивается в репозитории git. Я обнаружил, что атрибуты элементов, обрабатываемых XMLSerializer, меняются по порядку, в результате чего в моем хранилище появляются ложные изменения, например:

- <literal><token kind="w" id="en-us-esv-xeaugcbzgo">sent</token><token kind="s" id="en-us-esv-xeaugcbzgw"> </token></literal>
+ <literal><token id="en-us-esv-xeaugcbzgo" kind="w">sent</token><token id="en-us-esv-xeaugcbzgw" kind="s"> </token></literal>

Это не ошибка ни с одним из инструментов, которые я использую. Конечно, порядок атрибутов в элементе xml не должен иметь значения . Но, , поскольку git является линейно-ориентированным SCM, эти ложные и незначительные изменения будут отвлекать от реальных существенных изменений, которые я хочу отслеживать.

Вопрос: Есть ли способ удержать сериализатор от переупорядочения моих атрибутов? Альтернативно, существуют ли какие-либо инструменты для указания / ограничения порядка атрибутов?

Отредактировано выше для ясности: Мне известно, что, согласно Спецификации XML, "порядок спецификаций атрибутов в теге start-tag или empty-element не имеет значения": http://www.w3.org/TR/REC-xml/#sec-starttags. Достаточно сказать, что порядок атрибутов важен для меня . :)

Ответы [ 2 ]

1 голос
/ 24 августа 2010

Если это имеет значение, ошибка не в переупорядочении атрибутов, а в том, что это важно. Пусть он упорядочит их так, как хочет, и исправит ошибку.

Edit:

Подожди минутку. Почему это помещается в хранилище? Если это вывод, а не источник, то его значение в репозитории является нередактированным ресурсом, а не источником, и хранится для удобства. В противном случае, почему вы позволяете процессу компьютера изменить его?

Это аналогично размещению бинарного файла в хранилище, с теми же причинами, по которым это часто бывает плохо, и теми же причинами для создания исключений.

0 голосов
/ 26 августа 2010

Я выбрал направление, предложенное @Tomalak, и «исправляю» порядок на стороне сервера.К счастью, исходный порядок был алфавитным, а порядок, созданный XMLSerializer, обратный алфавитный.Мой инструмент XML на стороне сервера, lxml, поддерживает порядок атрибутов документа, поэтому поменять порядок очень просто:

xmls = json.loads(self.data['xmls'])
out = []
for xml in xmls:
    # DOM adds an XHTML namespace... silly DOM.
    xml = xml.replace('xmlns="http://www.w3.org/1999/xhtml"', '')
    tree = ET.fromstring(xml)
    for el in tree.xpath('//*'):
        attrs = dict(el.attrib)
        keys = el.attrib.keys()  # el.attrib preserves attribute order
        keys.reverse()  # But the browser DOM has reversed that order.
        # Put them back in the order we want.
        el.attrib.clear()
        for k in keys:
            el.attrib[k] = attrs[k]
    out.append(ET.tostring(tree, encoding=unicode))

Мои сравнения на основе строк снова полезны!

...