Есть ли какие-то пустые дочерние узлы для парсеров XML? - PullRequest
4 голосов
/ 25 декабря 2011

Почему у нас должно быть понятие пустых узлов 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

Что меня удивляет, так это то, что парсерпроводит различие между извлечением всех дочерних узлов и только непустых.

Может показаться, что для этих пустых узлов должно быть хотя бы одно вменяемое использование.Было бы интересно точно знать, что это за использование.

Ответы [ 2 ]

7 голосов
/ 25 декабря 2011

Рассмотрим этот случай из HTML:

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

против этого:

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

В первом примере нет пробельных узлов, и механизм рендеринга не будет помещатьпробел между привет мир .Во втором примере, поскольку между текстовыми узлами есть узел пробела, он будет выглядеть как hello world .

Вам необходимо знать, есть ли узлы пробелов, поскольку некоторые языки XML будут заботиться об их размещении.

3 голосов
/ 25 декабря 2011

Анализатор не может различить значимые пустые узлы и незначимые пустые узлы.Это полностью зависит от семантики XML.Если синтаксический анализатор исключил пустые узлы и вы писали приложение, где они были значительными, вы бы задали этот вопрос с другой точки зрения.

...