我使用CPAN XML::LibXML
模块来处理下面的XML数据。我需要确定每个元素是否有子元素。在我周围搜索找不到任何用于此目的的例子。如何检测XML元素是否有子元素
<A>
<ts>2012</ts>
<T>M1</T>
<T>M2</T>
<B>
<id>PC</id>
<r>10</r>
<r>30</r>
</B>
</A>
这是Perl代码我写havae
#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;
my ($x,$elname,$haschild)=();
my $parser = XML::LibXML->new();
my $npo = $parser->parse_file("test.xml");
my $rootel = $npo -> getDocumentElement();
$elname = $rootel -> nodeName();
print "Root name=$elname\n";
foreach $x ($rootel->childNodes) {
$elname = $x -> nodeName();
$haschild = $x->hasChildNodes;
print "Child name = $elname and has child = $haschild.\n" unless ($elname =~ /#text/i);
}
虽然我以前childNodes
要经过的每个节点,我无法找到一个简单的方法来确定节点是否有孩子或不。
我期待打通所有节点循环后,结果是:
A: Has children
ts: Has none
T: has none
T: has none
B: Has children
id: Has none
r: Has none
r: Has none
我得到的结果是这样的:
Root name=A
Child name = ts and has child = 1.
Child name = T and has child = 1.
Child name = T and has child = 1.
Child name = B and has child = 1.
似乎所有节点的hasChildNodes
后返回true状态检查。
嗯,你已经得到的样本数据,但如何张贴你有代码,尽管它还没有工作? – cjm
你错了。所有这些节点都有(文本)子节点,就像libxml所说的那样。你显然错误地认为“节点”和“元素”意味着相同的东西,但这是错误的。 – ikegami