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比較會發現它們的不同。
我不知道是否有一種簡單/簡單的方法來標準化名稱空間定義,比如說,將它們全部放在根元素中?
當然一個可以寫出這樣的代碼自己,但如果這是已經可用,這將是更好的方式:)
apache xmlsec項目也有一個http://santuario.apache.org/Java/api/org/apache/xml/security/c14n/Canonicalizer.html,它可以與w3c DOM api一起工作。 – jtahlborn
jtalhborn,謝謝你的提示。不幸的是,在我的情況下,apache XML安全canonializer不會產生規範輸出。我的通用問題是與命名空間聲明,例如: '<根的xmlns:富= 「HTTP://富/」>酒吧 ' 與 ' bar ' 在這種情況下,規範形式的XMLs是不一樣的,即使文檔的效果是。 –
skaffman,我也檢查了XOM API,並且得到了相同的結果。基本上,XML名稱空間聲明的位置不是「規範化」的,因此這些在「簡單」XML比較中被認爲是不同的。 我把一個例子放入主要文章來演示問題 –