3

XMLファイルをCSVファイルに変換するPerlスクリプトを作成する必要があります。私はすでに1つのコンテキストで単純なものを作成しましたが、別のデータセット用にそれを拡張する必要があり、何をすべきかを完全に理解することはできません。

XML::Simpleを使用しています。

データの1つのレコードは次のとおりです。

<custom-objects xmlns="http://www.demandware.com/xml/impex/customobject/2006-10-31">
    <custom-object type-id="emailBackInStockHistory" object-id="bczCAiaag0APcaaacLsvpJRmzW">
        <object-attribute attribute-id="email">some@email.com</object-attribute>
        <object-attribute attribute-id="emailSentAt">2010-04-10T09:00:01.000+0000</object-attribute>
        <object-attribute attribute-id="productID">someprodid</object-attribute>
        <object-attribute attribute-id="requestedAt">2010-04-09T10:07:54.000+0000</object-attribute>
        <object-attribute attribute-id="siteID">someSITEid</object-attribute>
    </custom-object>
</custom-objects>

Data :: Dumperモジュールを使用すると、データが次のように解析されることがわかります。

'custom-object' => [
    {
        'type-id'          => 'emailBackInStockHistory',
        'object-id'        => 'bczCAiaag0APcaaacLsvpJRmzW',
        'object-attribute' => [
            {
                'attribute-id' => 'email',
                'content'      => 'some@email.com'
            },
            {
                'attribute-id' => 'emailSentAt',
                'content'      => '2010-04-10T09:00:01.000+0000'
            },
            {
                'attribute-id' => 'productID',
                'content'      => 'someprodid'
            },
            {
                'attribute-id' => 'requestedAt',
                'content'      => '2010-04-09T10:07:54.000+0000'
            },
            {
                'attribute-id' => 'siteID',
                'content'      => 'someSITEid'
            }
        ]
    },

このエクスポートを実行するために使用しようとしたコードは次のとおりです。

foreach $o (@{$data->{'custom-object'}}) {
    print $o->{'type-id'},   ",";
    print $o->{'object-id'}, ",";
    print $o->{'custom-object'}->{'object-attribute'}->{'email'}, ",";
    print "\n";

type-idand属性はobject-id正しく出力されますが、参照からデータを印刷する方法がわかりませんobject-attribute

4

1 に答える 1

2

object-attribute配列参照で行うように、配列参照を反復処理する必要がありますcustom-object。csv ファイルを作成するより堅牢な方法については、Text::CSVも参照してください。

foreach my $obj ( @{ $data->{'custom-object'} } ) {
    print $obj->{'type-id'}, ",";
    print $obj->{'object-id'}, ",";
    foreach my $attr ( @{ $obj->{'object-attribute'} } ) {
        if ( $attr->{'attribute-id'} eq 'email' ) {
            print $attr->{'content'}, ",";
        }
    }
    print "\n";
}
于 2012-06-26T00:52:28.413 に答える