2010-08-28 184 views
2

的順序我有一個代碼行是這樣的:JAXBContext中和的Marshaller改變XML命名空間

StringWriter writer = new StringWriter(); 
JAXBContext jc = JAXBContext.newInstance(namespace); 
Marshaller marshaller = jc.createMarshaller();   
marshaller.marshal(input, writer); 

namespace = "nfpa:nfpares"。我有一個生成的內容是這樣的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ServiceRequest xmlns:ns2="nfpares" xmlns="nfpa"> 
... 
</ServiceRequest> 

,但不知何故,在庫(我沒有控制),開發者還使用JAXBContext和相同的命名空間的另一部分,但所產生的內容是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ServiceRequest xmlns="nfpa" xmlns:ns2="nfpares"> 
... 
</ServiceRequest> 

注意名稱空間仍然相同,但是它們的排序已經切換。我需要對原始內容進行加密驗證。除了命名空間的順序之外,這兩者之間的一切都是相同的。有誰知道發生了什麼?因爲我使用JAXBContext的不同版本?

感謝

+0

@ user267476 - 使用'101010'按鈕來格式化代碼(縮進4個空格)http://stackoverflow.com/editing-help – McDowell 2010-08-28 09:22:51

回答

4

當XML做加密簽名支票,你需要在caninical形式的XML工作。與xml解析器相同的xml結構有許多不同的序列化可能性。例如<a/> vs <a></a>,&#160; vs &#xA0;或屬性和命名空間的順序。存在用於XML canonicalization一個標準,該標準描述了以下變換:

XML文檔的規範的形式是由該方法>在本說明書中描述製備的文檔的物理表示。這些變化歸納在以下列表:

  • 本文件是UTF-8
  • 線路編碼打破標準化爲#xA輸入,解析
  • 屬性值之前進行歸一化,就好像被驗證處理器
  • 字符和解析實體引用代替
  • CDATA部分與它們的字符內容
  • XML聲明和文檔類型定義(DTD)代替被除去
  • 空元素被轉換爲起動結束標記對
  • 空白開始和結束標籤內的文檔元素的和外面是歸一化的
  • 在字符內容的所有空格被保留(不包括換行歸一化過程中除去字符)
  • 屬性值的分隔符被設置爲引號(雙引號)
  • 在屬性值和字符內容的特殊字符由字符被替換引用
  • 多餘命名空間聲明從各元件上取下
  • 默認屬性被添加到每個元件
  • 詞典順序是在該方法的一種實現可以在apache xml security project在類Canonicalizer中找到的每個元素

的命名空間聲明和屬性施加

+0

優秀的XOM p中還有另一個Canonicalizer實現ackage(http://www.xom.nu/apidocs/nu/xom/canonical/Canonicalizer.html) – skaffman 2010-08-30 18:02:26