2011-05-05 85 views
3

我正在使用XML :: LibXML(Ver:1.70)。使用XML遍历节点:: LibXML

我的XML输入文件看起来像这样:

<?xml version="1.0" encoding="UTF-8"?> 
<Equipment xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Equipments> 
    <ECID logicalName="SysNameAlpha" id="0"/> 
    <ECID logicalName="SysNameBeta" id="1"/> 
    </Equipments> 
</Equipment> 

和我的Perl脚本:

my $file = 'data.xml'; 
my $parser = XML::LibXML->new(); 
my $tree = $parser->parse_file($file); 
my $root = $tree->getDocumentElement; 

foreach my $camelid ($root->findnodes('Equipments')) { 
    my $name = $camelid->findvalue('ECID/@logicalName'); 
    my $id = $camelid->findvalue('ECID/@id'); 
    print $name; 
    print " = "; 
    print $id; 
    print ";\n"; 
} 

我得到的输出是:

SysNameAlphaSysNameBeta = 01; 

但我想这样的输出:

SysNameAlpha = 0;  
SysNameBeta = 1; 

我该如何做到这一点?

回答

12

节点只有一个Equipments,因此您只能得到一个$camelid进行扫描。为了补救,你可能会稍微改变一些东西,例如重复设备/ ECIDs:

foreach my $camelid ($root->findnodes('Equipments/ECID')) { 
    my $name = $camelid->findvalue('@logicalName'); 
    my $id = $camelid->findvalue('@id'); 
    ... 
}