对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
令我百思不解的是,解析器使得检索所有子节点,只有非空的人之间的区别。
看来那么这些空白节点至少必须有一个理智用法。准确地知道这些用途是什么会很有趣。
考虑从HTML这种情况下:
<div><b>hello</b><i>world</i></div>
VS这一个:
<div>
<b>hello</b>
<i>world</i>
</div>
在第一个例子,有没有空白节点,以及渲染引擎不会将之间的空间你好世界。在第二个示例中,由于文本节点之间存在空白节点,因此它将以hello世界的形式出现。
您需要知道空白节点在那里,因为有些XML语言会关心它们的位置。
您的最后一句话几乎就我的解释而言......仅仅是格式化的空白节点呢? – Zaid 2011-12-25 08:30:16
格式化是错误的词,空白节点包含解释文档时可能使用或可能不使用的其他信息。在上面的例子中,区别在'helloworld'和'hello world'之间。 – 2011-12-25 10:07:43
解析器无法区分重要空白节点和非重要空白节点。这完全取决于XML的语义。如果解析器消除了空白节点,并且您正在编写一个重要的应用程序,那么您可以从另一个角度写这个问题。
何时空白节点显着?你能提供一些例子吗? – Zaid 2011-12-24 20:29:44
我们在谈论空白节点,对吗?每个“子”元素之间都有一个(非显着的)空白节点。符合性解析器将允许您忽略这些。 – harpo 2011-12-24 20:20:08
@harpo:问题不清楚吗?这些空白节点有用吗?我想在这个问题上受到教育。 – Zaid 2011-12-24 20:22:52