2012-05-11 56 views
4

我想知道是否有一種直接的方法來在XML文檔中將XML名稱空間定義「歸一化」,用Java表示爲DOM文檔?在Java中的DOM文檔中規範XML名稱空間?

我需要這個的原因是能夠比較兩個文件,它們都使用XML名稱空間。

由於XML名稱空間可以在文檔中的任何位置(在根元素中,在任何元素中)指定等,從DOM樹透視圖看,實際上相同的兩個文檔可能會有顯着不同。例如,可以在根元素中定義所有名稱空間屬性,而另一個可以在名稱空間適用的DOM樹層次結構中的「最高」元素處定義每個名稱空間。實質上這些可以是相同的文檔,但是在比較它們時,比如說使用XmlUnit,就會得到比較問題。

提供兩個例子:

<root xmlns:foo="http://foo/"> 
    <e1> 
     <foo:e2>bar</foo:e2> 
    </e1> 
</root> 

VS:

<root> 
    <e1 xmlns:foo="http://foo/"> 
     <foo:e2>bar</foo:e2> 
    </e1> 
</root> 

這些文件實際上是相同的,但一個XML比較會發現它們的不同。

我不知道是否有一種簡單/簡單的方法來標準化名稱空間定義,比如說,將它們全部放在根元素中?

當然一個

可以寫出這樣的代碼自己,但如果這是已經可用,這將是更好的方式:)

回答

4

XOM APICanonicalizer出於這樣的目的。它不是標準的W3C DOM API,但也許它可以滿足你的需求。

+1

apache xmlsec項目也有一個http://santuario.apache.org/Java/api/org/apache/xml/security/c14n/Canonicalizer.html,它可以與w3c DOM api一起工作。 – jtahlborn

+0

jtalhborn,謝謝你的提示。不幸的是,在我的情況下,apache XML安全canonializer不會產生規範輸出。我的通用問題是與命名空間聲明,例如: '<根的xmlns:富= 「HTTP://富/」>酒吧' 與 ' bar' 在這種情況下,規範形式的XMLs是不一樣的,即使文檔的效果是。 –

+0

skaffman,我也檢查了XOM API,並且得到了相同的結果。基本上,XML名稱空間聲明的位置不是「規範化」的,因此這些在「簡單」XML比較中被認爲是不同的。 我把一個例子放入主要文章來演示問題 –