我想使用perl和XML :: Simple将XML文件中的少量数据提取到csv文件中。打印XML数组值
下面是数据的编辑版本:使用该脚本
<?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(...),但不适用于只有一个数据元素的文件,并且a很明显,这段代码从来没有进入定制属性数组来打印任何东西。
我在做什么错?
更新:
改变在上述的循环代码这样:
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,
这似乎是代码只是没有进入自定义属性循环,我不知道为什么。
要添加到你的其他出色的问题,你能否也请粘贴'print Dumper($ data);'的输出?这会让答案变得更加简单 - 坦率地说,可能会让你知道问题的原因:) +1 – DVK