package SalesOrder; use Class::MethodMaker new_hash_init => 'new', get_set => [qw(Customer OrderDate SONumber Items)], ; package Customer; use Class::MethodMaker new_hash_init => 'new', get_set => [qw(CustName CustNumber Street City State PostCode)], ; package Item; use Class::MethodMaker new_hash_init => 'new', get_set => [qw(ItemNumber Part Quantity)], ; package Part; use Class::MethodMaker new_hash_init => 'new', get_set => [qw(PartNumber Description Price)], ; package main; use strict; use warnings; use Data::Dumper; use XML::Simple; my $xml = XMLin(\*DATA, KeyAttr => []); my $items = [ map Item->new(Part => Part->new(delete $_->{Part}), %$_), @{$xml->{Item}} ]; delete $xml->{Item}; my $sales_order = SalesOrder->new( Customer => Customer->new(%{ delete $xml->{Customer} }), Items => $items, %$xml, ); print Dumper $sales_order; __DATA__ ABC Industries 123 Main St. Chicago IL 60609 981215 Turkey wrench: Stainless steel, one-piece construction, lifetime guarantee. 9.95 10 Stuffing separator: Aluminum, one-year guarantee. 13.27 5