我使用XML :: Simple来解析XML文件.代码在下面给出了XML文件,
use Tie::IxHash;
tie %$data, "Tie::IxHash";
use XML::Simple;
use Data::Dumper;
$xml = new XML::Simple;
$data = $xml->XMLin("ship_order.xml");
print Dumper($data);
Run Code Online (Sandbox Code Playgroud)
XML文件,(ship_order.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<shipment>
<shiptoaddress>
<name>Prasad</name>
<address>AnnaNagar</address>
</shiptoaddress>
<items>
<quantity>5</quantity>
<price>100</price>
</items>
<items>
<quantity>6</quantity>
<price>50</price>
</items>
<num_of_items>2</num_of_items>
</shipment>
Run Code Online (Sandbox Code Playgroud)
即使我使用Tie :: IxHash模块,输出也没有按顺序排列.
我的输出:
$VAR1 = {
'num_of_items' => '2',
'shiptoaddress' => {
'name' => 'Prasad',
'address' => 'AnnaNagar'
},
'items' => [
{
'quantity' => '5',
'price' => '100'
},
{
'quantity' => '6',
'price' => '50'
}
]
};
Run Code Online (Sandbox Code Playgroud)
啊,但你没有使用Tie::IxHash.或者更确切地说,你开始使用Tie::IxHash然后销毁它:
$data = $xml->XMLin("ship_order.xml");
Run Code Online (Sandbox Code Playgroud)
此行会丢弃您创建的哈希引用,并从方法调用中分配一个哈希引用$data.
如果您关心项目的顺序(并且您可能不应该这样做,因为任何体面的XML格式都将包含一个告诉您顺序的属性),您将需要使用返回对象的解析器,而不是数据结构.对象将知道项目的顺序,并为您提供children返回它们的方法.
或者,您可以自己构建数据结构:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $shipment;
my $t = XML::Twig->new(
twig_handlers => {
shiptoaddress => sub {
my ($t, $elt) = @_;
$shipment->{name} = $elt->first_child("name")->text;
$shipment->{address} = $elt->first_child("address")->text;
$t->purge;
},
items => sub {
my ($t, $elt) = @_;
push @{$shipment->{items}}, {
quantity => $elt->first_child("quantity")->text,
price => $elt->first_child("price")->text,
};
$t->purge;
},
},
);
$t->parse(join "", <DATA>); #FIXME: use parsefile later
use Data::Dumper;
print Dumper $shipment;
__DATA__
<?xml version="1.0" encoding="UTF-8" ?>
<shipment>
<shiptoaddress>
<name>Prasad</name>
<address>AnnaNagar</address>
</shiptoaddress>
<items>
<quantity>5</quantity>
<price>100</price>
</items>
<items>
<quantity>6</quantity>
<price>50</price>
</items>
<num_of_items>2</num_of_items>
</shipment>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2468 次 |
| 最近记录: |