2014-10-31 2 views
0

Работаю с XML-файлом (делает его проверку). Мне нужно отредактировать некоторые атрибуты перед вычислением функции CRC32 всего файла. Я использую парсер DOM и xPath. После того как я редактировал свой файл, я преобразуя его в массив байтов для функции CRC-:Java edit xml file (сохранить порядок атрибутов)

Node file_crc = (Node) xPath.compile("/IODevice/Stamp/@crc").evaluate(doc, XPathConstants.NODE); 
    file_crc.setTextContent(""); 
    bos = new ByteArrayOutputStream(); 
    result = new StreamResult(bos); 
    try { 
     transformer.transform(new DOMSource(doc), result); 
     crc.reset(); 
     crc.update(bos.toByteArray()); 
    } catch (TransformerException ex) { 
     return false; 
    } 

Проблема заключается в том, что изменения анализатор DOM атрибуты порядка в XML-файле (сортирует их alphabeticaly) - это причина неверной контрольной суммы файла. Как избежать мутации атрибутов?

ответ

3

Порядок атрибутов в XML не имеет значения. Приложения могут свободно хранить атрибуты элемента в любом порядке. Таким образом, это поведение следует ожидать от DOM и XPath.

Насколько я понимаю, CRC32 плохо подходит в случае XML-документов, поскольку документы,

<root a="1" b="2"/> 

и

<root b="2" a="1"/> 

являются фактически то же самое. Как правило, вы не должны писать XML-приложения, которые рассматривают порядок атрибутов как значимые, потому что нет никакого способа контролировать это. Если что-либо, атрибуты и объявления пространства имен должны быть перечислены в «восходящем лексикографическом порядке» (xml.com).


Соответствующая часть информации из XML specification говорит:

Обратите внимание, что порядок спецификации атрибутов в начальном тэге или тэге пустого элемента не имеет существенного значения.

Возможно, вам понравится ссылка на some moreon this?

+0

Это не было мое решение использовать такой механизм). Просто нужно обойти эту проблему. – Constantine

+0

@KostyaKrivomaz Как разобрать исходный файл в представлении DOM и сериализовать его, не меняя ничего? Затем атрибуты могут быть в лексикографическом порядке, и вы можете использовать этот промежуточный файл для контрольной суммы. –

2

Порядок атрибутов определен как несущественный в XML: никакое сопоставимое XML-приложение не должно давать результаты, зависящие от порядка появления атрибутов. Поэтому сериализаторы (код, который производит лексический XML в качестве вывода) обычно не дают вам никакого контроля над порядком.

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

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