2010-03-16 69 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表示中完美重构。没有信息丢失。