2012-05-01 19 views
8

これは非常に単純な問題だと思うが、私は多くの検索にもかかわらずそれを理解することはできない。XML :: LibXMLを使用してXMLを解析するPerlスクリプト。

私はこれをCSVファイルに書き込むことができるように、TAG = VALUEと同様のものを印刷するために次のXMLを解析しようとしています。問題は、タグが各サンプルで必ずしも同じではないということです。私は実際のタグ名を取得する方法を把握していないようです。どのような助けも感謝!

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> 

- あなたは、あなただけの各<sample>内部タグを介して実行するために余分なループをタグ名を取得するための右の方法を必要としている

#!/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

#!/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というチュートリアルサイトを作成しました。このチュートリアルサイトは、このタイプの質問に正確に答えています。 `(私の$の子をするforeach $サンプル:

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を置き換えることができます - > findnodes( '*')){' – ikegami

+0

ありがとう、素晴らしい! – lozwell

関連する問題