perl と XML::Simple を使用して、XML ファイルから少量のデータを csv ファイルに抽出しようとしています。
データの編集版は次のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<orders xmlns="http://www.demandware.com/xml/impex/order/2006-10-31">
<order order-no="W100148941">
<order-date>2011-08-22T16:15:47.000Z</order-date>
<custom-attributes>
<custom-attribute attribute-id="basket_notes">bnotes974211</custom-attribute>
<custom-attribute attribute-id="omOrderID">974211</custom-attribute>
</custom-attributes>
</order>
</orders>
このスクリプトを使用して:
#!/usr/bin/perl
use XML::Simple;
use Data::Dumper;
$xml = new XML::Simple;
$data = $xml->XMLin("$ARGV[0]", ForceArray=>1);
print Dumper($data);
foreach $o (@{$data->{order}}) {
print "$ARGV[1]", ",";
print "$ARGV[2]", ",";
print "$ARGV[3]", ",";
print "$ARGV[4]", ",";
print $o->{"order-no"}, ",";
print $o->{"order-date"}, ",";
foreach my $o ( @{ $data->{'custom-attribute'} } ) {
print 'in level 1';
foreach my $attr ( @{ $data->{'custom-attribute'} } ) {
print 'in level 2';
if ( $attr->{'attribute-id'} eq 'basket_notes' ) {
print '"', $data->{'content'}, '"', ",";
}
}
}
print "\n";
}
この出力を取得します:
,,,,W100148941,ARRAY(0x7f7f63a524c0),
ForceArray オプション XMLin を使用しないと、上記の ARRAY(...) が正しい値に置き換えられますが、データ要素が 1 つしかないファイルでは機能しません。また、明らかなように、このコードはカスタム属性配列にはなりません。何でも印刷します。
私は何を間違っていますか?
アップデート:
上記のループ コードを次のように変更します。
foreach $o (@{$data->{order}})
{
print "$ARGV[1]", ",";
print "$ARGV[2]", ",";
print "$ARGV[3]", ",";
print "$ARGV[4]", ",";
print $o->{"order-no"}, ",";
#print $o->{"order-date"}, ",";
print $o->{"order-date"}->[0], ",";
foreach my $o ( @{ $data->{'custom-attributes'} } ) {
print 'in level 1';
foreach my $attr ( @{ $o->{'custom-attribute'} } ) {
print 'in level 2';
if ( $attr->{'attribute-id'} eq 'omOrderID' ) {
print '"', $data->{'content'}, '"', ",";
}
}
}
print "\n";
}
これが得られます:
、、、、W100148941、2011-08-22T16:15:47.000Z、
コードがカスタム属性ループに入っていないように見えますが、その理由はわかりません。