Ах, но вы не используете Tie::IxHash
.Точнее, вы начинаете с использования Tie::IxHash
, а затем уничтожаете его:
$data = $xml->XMLin("ship_order.xml");
Эта строка отбрасывает созданную вами ссылку на хэш и присваивает ее из вызова метода для $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>