2010-08-23 4 views
3

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

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> 

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

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

Отредактировано выше для ясности: Я знаю, что, в соответствии с XML-спецификации, «порядок спецификации атрибутов в начальном тэге или тэге пустого элемента не имеет существенного значения»: http://www.w3.org/TR/REC-xml/#sec-starttags. Достаточно сказать, что упорядочение атрибутов значимо для меня . :)

+1

Как кажется, атрибуты в конечном итоге упорядочены по алфавиту. Разве вы не можете просто установить это как соглашение? Может быть, небольшое изменение в коде Python, которое манипулирует XML, заставляет их сразу появляться в «правильном» порядке? – Tomalak

+0

Возможно, это то, что я в конечном итоге сделаю. Неудобно, мои инструменты управления XML (lxml, оболочка python для libxml2) не учитывают упорядочение атрибутов как значимые (и правильно!). Следовательно, мое редактирование на вопрос выше. –

ответ

0

Я взял направление @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)) 

Моя линия на основе дифференциалы полезны снова!

1

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

Редактировать:

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

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

+0

SCM, как правило, ориентированы на линию, и, к сожалению, AFAIK не существует каких-либо систем SCM, которые «понимают» XML до такой степени, что могут игнорировать те вещи, которые не имеют значения в XML. В этом случае определение того, являются ли два файла XML «одинаковыми», может зависеть от семантики данных. –

+1

@Jim, ну тогда XML не является выходом для использования. –

+0

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

Смежные вопросы