2

XMLデータを取得するために以下のファイルを作成しました。

入力:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ExecutionLogs>
    <category cname='Condition1' cid='T1'>
        <log>value1</log>
        <log>value2</log>
        <log>value3</log>
    </category>
    <category cname='Condition2' cid='T2'>
        <log>value4</log>
        <log>value5</log>
        <log>value6</log>
    </category>
        <category cname='Condition3' cid='T3'>
        <log>value7</log>
    </category>
</ExecutionLogs>

以下のような出力が欲しいのですが、

Condition1 -> value1,value2,value3
Condition2 -> value4,value5,value6
Condition3 -> value7

以下のコードを試してみましたが、

use strict;
use XML::Simple;
my $filename = "input.xml";
$config = XML::Simple->new();
$config = XMLin($filename);
@values = @{$config->{'category'}{'log'}};

これについて私を助けてください。前もって感謝します。

4

2 に答える 2

4

XML::Twig を使用してこれを行う方法:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

XML::Twig->new( twig_handlers => { 
                   category => sub { print $_->att( 'cname'), ': ', 
                                           join( ',', $_->children_text( 'log')), "\n";
                               },
                },
              )

         ->parsefile( 'my.xml');

categoryハンドラーは、要素が解析されるたびに呼び出されます。$_要素そのものです。

于 2014-12-16T06:30:31.483 に答える
1

私がすること:

use strict; use warnings;
use XML::Simple;
my $config = XML::Simple->new();
$config = XMLin($filename, ForceArray => [ 'log' ]);
#   we want an array here  ^---------------------^ 

my @category = @{ $config->{'category'} };
#              ^------------------------^
# de-reference of an ARRAY ref  

foreach my $hash (@category) {
    print $hash->{cname}, ' -> ', join(",", @{ $hash->{log} }), "\n";
}

出力

Condition1 -> value1,value2,value3
Condition2 -> value4,value5,value6
Condition3 -> value7

ノート

ForceArray => [ 'log' ]{category}->[@]->{log] そうでない限り、同じ型を確実に処理するためARRAYにあります。最後の"Condition3".

XML::Simple#ForceArray を確認してください

于 2014-12-16T06:17:03.080 に答える