2011-12-24 44 views
4

爲什麼我們必須要有空白XML節點的概念?他們爲XML解析的鍊金術帶來了什麼好處?對XML解析器有任何用處的空白子節點?

一個簡單的例子這裏用Perl的XML::LibXML

use strict; 
use warnings; 
use feature 'say'; 
use XML::LibXML; 

my $xml = XML::LibXML->load_xml(string => <<'XMLDOC'); 
<alphabet> 
<child name='alpha'/> 
<child name='bravo'/> 
<child name='charlie'/> 
<child name='delta'/> 
<child name='echo'/> 
</alphabet> 
XMLDOC 

my ($parent) = $xml->findnodes('/alphabet'); 

my @all_kids = $parent->childNodes; 
my @real_kids = $parent->nonBlankChildNodes; 

say 'All kids : ', scalar @all_kids; # '11' 
say 'Real kids : ', scalar @real_kids; # '5' => 6 blank child nodes 

令我百思不解的是,解析器使得檢索所有子節點,只有非空的人之間的區別。

看來那麼這些空白節點至少必須有一個理智用法。準確地知道這些用途是什麼會很有趣。

+1

我們在談論空白節點,對嗎?每個「子」元素之間都有一個(非顯着的)空白節點。符合性解析器將允許您忽略這些。 – harpo 2011-12-24 20:20:08

+0

@harpo:問題不清楚嗎?這些空白節點有用嗎?我想在這個問題上受到教育。 – Zaid 2011-12-24 20:22:52

回答

7

考慮從HTML這種情況下:

<div><b>hello</b><i>world</i></div> 

VS這一個:

<div> 
    <b>hello</b> 
    <i>world</i> 
</div> 

在第一個例子,有沒有空白節點,以及渲染引擎不會將之間的空間你好世界。在第二個示例中,由於文本節點之間存在空白節點,因此它將以hello世界的形式出現。

您需要知道空白節點在那裏,因爲有些XML語言會關心它們的位置。

+0

您的最後一句話幾乎就我的解釋而言......僅僅是格式化的空白節點呢? – Zaid 2011-12-25 08:30:16

+0

格式化是錯誤的詞,空白節點包含解釋文檔時可能使用或可能不使用的其他信息。在上面的例子中,區別在'helloworld'和'hello world'之間。 – 2011-12-25 10:07:43

3

解析器無法區分重要空白節點和非重要空白節點。這完全取決於XML的語義。如果解析器消除了空白節點,並且您正在編寫一個重要的應用程序,那麼您可以從另一個角度寫這個問題。

+0

何時空白節點顯着?你能提供一些例子嗎? – Zaid 2011-12-24 20:29:44