2014-10-31 105 views
0

我正在使用xml文件(進行驗證)。在計算整個文件的CRC32函數之前,我需要編輯一些屬性。 我使用DOM解析器和xPath。 我已經編輯我的文件後,我將其轉換爲字節數組的CRC-功能:Java編輯xml文件(保存屬性順序)

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 more的意見on this

+0

這不是我決定使用這樣的機制)我只需要解決這個問題。 – Constantine 2014-11-01 04:57:17

+0

@KostyaKrivomaz如何將原始文件解析爲DOM表示並將其序列化而不更改任何內容?然後,屬性可能按字典順序排列,您可以使用該中間文件作爲校驗和。 – 2014-11-01 14:32:58

2

屬性的順序在XML中定義爲無關緊要:不符合規範的XML應用程序應產生取決於屬性出現順序的結果。因此,序列化程序(生成詞法XML作爲輸出的代碼)通常不會控制訂單。

現在,出於美觀的原因,有時候會很高興有這種控制,因爲XML被設計爲人類可讀的。所以有一個想要這個功能的正當理由。但事實是,我知道沒有提供它的序列化器。