对XML解析器有任何用处的空白子节点?

问题描述:

为什么我们必须要有空白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

考虑从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

解析器无法区分重要空白节点和非重要空白节点。这完全取决于XML的语义。如果解析器消除了空白节点,并且您正在编写一个重要的应用程序,那么您可以从另一个角度写这个问题。

+0

何时空白节点显着?你能提供一些例子吗? – Zaid 2011-12-24 20:29:44