8

これは非常に単純な問題だと思いますが、多くの検索を行っても理解できません。

次の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";

}
4

2 に答える 2

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というチュートリアル サイトを作成しました。

于 2012-05-01T21:21:59.083 に答える
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
于 2012-05-01T21:25:21.153 に答える