2010-03-16 96 views
15

我正在做一些測試,但是當我使用或不使用normalize()方法時,我看不出有什麼區別。 但ExampleDepot網站上的例子使用它。 那麼,它是爲了什麼? (這個文檔對我來說也不是很清楚)Java Node標準化方法做什麼?

回答

21

你可以編程的方式構建一個具有與實際XML結構不對應的多餘結構的DOM樹 - 特別是像多個相鄰節點類型的節點,或者空節點鍵入文本。 normalize()方法刪除這些,即它組合相鄰的文本節點並刪除空的節點。

當其他代碼期望DOM樹總是看起來像從實際的XML文檔構建的東西時,這會很有用。

這基本上意味着,下面的XML元素

<foo>hello 
wor 
ld</foo> 

可以像這樣在一個非規範化節點來表示:

Element foo 
    Text node: "" 
    Text node: "Hello " 
    Text node: "wor" 
    Text node: "ld" 

當標準化,該節點將看起來像這樣

Element foo 
    Text node: "Hello world" 
3

它清理相鄰文本節點和空文本節點的代碼

0

標準化XML文檔的根元素。這確保了根節點下的所有Text節點都被放入「正常」形式,這意味着文檔中既沒有相鄰的Text節點也沒有空的Text節點。

2

有很多可能的DOM樹對應於相同的XML結構,每個XML結構至少有一個對應的DOM樹。所以從DOM到XML的轉換是surjective。 所以可能發生:

dom_tree_1 != dom_tree_2 
# but: 
dom_tree_1.save_DOM_as_XML() == dom_tree_2.save_DOM_as_XML() 

而且也沒有辦法保證:

dom_tree == dom_tree.save_DOM_as_XML().load_DOM_from_XML() 

但是,我們想擁有它bijective。這意味着每個XML結構都對應一個特定的DOM樹。

因此,您可以定義所有可能的DOM樹的子集,這些樹對於所有可能的XML結構集都是雙射的。

# still: 
dom_tree.save_DOM_as_XML() == dom_tree.normalized().save_DOM_as_XML() 
# but with: 
dom_tree_n = dom_tree.normalize() 
# we now even have: 
dom_tree_n == dom_tree_n.save_DOM_as_XML().load_DOM_from_XML().normalize() 

因此規範化的DOM樹可以從其XML表示中完美重構。沒有信息丟失。