これは非常に単純な問題だと思いますが、多くの検索を行っても理解できません。
次の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";
}
タグ名を取得するための適切な方法があります。各<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";
}
Edit: Perl XML :: LibXML by Example というチュートリアルサイトを作成しました。これはまさにこのタイプの質問に答えます。
サンプルノードの子を反復処理する必要があります。
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