You are correct. I cut and pasted and then entered the populate sub. It is my understanding that twig sets up handlers that are called for each element in the xml when you go to parse the file. The XML I'm dealing with is structured in a highly peculiar way.
There's a brief header with information that is irrelevant to What I'm using the data for. All remaining data is under a parent titled "Data." Under that parent are roughly 500 children, each of which is a product with roughly 300 properties setup as children of it's own. The problem for me is that those properties aren't uniform. 60 items may have a listing for "number of pages" while others will have "number of tracks." Each item is massive, so here's a brief snippet.
<is:ItemMaster>
<is:ItemMasterHeader>
<oi:ItemID agencyRole="Product_Number">some_number</oi:ItemID>
<oi:ItemID agencyRole="Prefix_Number">some_number</oi:ItemID>
<oi:ItemID agencyRole="Stock_Number">some_number</oi:ItemID>
<oi:ManufacturerItemID>some_manufacturer_ID</oi:ManufacturerID>
<is:Classification type="Group"></is:Classification>
<is:Classification></is:Classification>
Each of these ItemMasters has around eight children and the children have anywhere from one to twenty-four children. Because the children are not uniform this is giving me headaches.
Here's my first revision
#!/bin/perl
use XML::Twig;
%Items=();
my $twig=XML::Twig->new(
twig_handlers =>
{populate=> sub { while (<>)
{ if (%Items !~ m/"<us:"|"<oa:"(.*)/) { $Items{$1} =1}
else {$Items{$2} =($Items{$1}+(/$1/)) }
}; #If element is not in the hash, adds it
}, #If element is in the hash, adds the number of matches
div => sub { $_[0]->purge; }, # free memory
},
);
$twig->parsefile( '500syncItemMaster.xml'); # build it
$twig->purge; # clear end of document from memory
print %Items; # output the twig
Now when I print I get nothing. I tried a test run and it seems like the handlers are not getting called at all. |