2012-05-01 133 views
8

我认为这是一个非常简单的问题,但尽管进行了很多搜索,我仍无法弄清楚。使用XML :: LibXML解析XML的Perl脚本;

我想解析下面的XML来打印类似于TAG = VALUE的东西,以便我可以将其写入CSV文件。问题是每个样本的标签并不总是相同的。我似乎无法弄清楚如何得到实际的标签名称。任何帮助赞赏!

XML文件 -

<Statistics> 
    <Stats> 
    <Sample> 
     <Name>System1</Name> 
     <Type>IBM</Type> 
     <Memory>2GB</Memory> 
     <StartTime>2012-04-26T14:30:01Z</StartTime> 
     <EndTime>2012-04-26T14:45:01Z</EndTime> 
    </Sample> 

    <Sample> 
     <Name>System2</Name> 
     <Type>Intel</Type> 
     <Disks>2</Disks> 
     <StartTime>2012-04-26T15:30:01Z</StartTime> 
     <EndTime>2012-04-26T15:45:01Z</EndTime> 
     <Video>1</Video> 
    </Sample> 
    </Stats> 
</Statistics> 

脚本 -

#!/usr/bin/perl 
use XML::LibXML; 

$filename = "data.xml"; 

my $parser = XML::LibXML->new(); 
my $xmldoc = $parser->parse_file($filename); 

for my $sample ($xmldoc->findnodes('/Statistics/Stats/Sample')) { 

print $sample->nodeName(), ": ", $sample->textContent(), "\n"; 

} 

回答

16

您已经为越来越标签名称正确的方法,你只需要一个额外的循环通过每个<sample>里面的标签来运行:

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::LibXML; 

my $filename = "data.xml"; 

my $parser = XML::LibXML->new(); 
my $xmldoc = $parser->parse_file($filename); 

for my $sample ($xmldoc->findnodes('/Statistics/Stats/Sample')) { 
    for my $property ($sample->findnodes('./*')) { 
     print $property->nodeName(), ": ", $property->textContent(), "\n"; 
    } 
    print "\n"; 
} 

编辑:我现在有创建了一个名为Perl XML::LibXML by Example的教程网站,它正确回答了这种类型的问题。

5

您需要遍历样本点的孩子,

for my $sample ($xmldoc->findnodes('/Statistics/Stats/Sample')) { 
    print $sample->nodeName(), "\n"; 
    foreach my $child ($sample->getChildnodes) { 
     if ($child->nodeType() == XML_ELEMENT_NODE) { 
      print "\t", $child->nodeName(), ":", $child->textContent(), "\n"; 
     } 
    } 
} 

将显示,

Sample 
     Name:System1 
     Type:IBM 
     Memory:2GB 
     StartTime:2012-04-26T14:30:01Z 
     EndTime:2012-04-26T14:45:01Z 
Sample 
     Name:System2 
     Type:Intel 
     Disks:2 
     StartTime:2012-04-26T15:30:01Z 
     EndTime:2012-04-26T15:45:01Z 
     Video:1 
+2

线3 + 4 + 6可以替换为:'的foreach我的$的孩子($样本 - > findnodes('*')){' – ikegami

+0

谢谢,真棒! – lozwell