我正在使用CPAN XML::LibXML模块处理下面的XML数据.我需要确定每个元素是否都有子元素.搜索我无法找到任何这样的例子.
<A>
<ts>2012</ts>
<T>M1</T>
<T>M2</T>
<B>
<id>PC</id>
<r>10</r>
<r>30</r>
</B>
</A>
Run Code Online (Sandbox Code Playgroud)
这是我写的Perl代码
#!/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);
}
Run Code Online (Sandbox Code Playgroud)
虽然我过去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
Run Code Online (Sandbox Code Playgroud)
我得到的结果是这样的:
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.
Run Code Online (Sandbox Code Playgroud)
在hasChildNodes条件检查后,似乎所有节点都返回true .
您要求的是节点的子元素数.子节点将包括文本和无关紧要的空白.
计算节点具有的子元素数量的最简单方法是使用findnodes('*')->sizeXPath表达式*仅计算子元素.
这是一些代码,可以完成您所描述的内容
use v5.14;
use warnings;
use XML::LibXML;
my $xml = XML::LibXML->load_xml(string => <<XML);
<A>
<ts>2012</ts>
<T>M1</T>
<T>M2</T>
<B>
<id>PC</id>
<r>10</r>
<r>30</r>
</B>
</A>
XML
my $nodes = $xml->findnodes('//*');
foreach my $node ($nodes->get_nodelist) {
my $children;
for ($node->findnodes('*')->size) {
$children = 'none' when 0;
$children = '1 child' when 1;
default { $children = "$_ children" }
}
printf "%s: has %s\n", $node->localname, $children;
}
Run Code Online (Sandbox Code Playgroud)
产量
A: has 4 children
ts: has none
T: has none
T: has none
B: has 3 children
id: has none
r: has none
r: has none
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3909 次 |
| 最近记录: |