XML-Simple - Using keyattr causes repeated elements to be ignored

Posted on Tue Mar 28 17:31:08 2006 by monicad
Using keyattr causes repeated elements to be ignored
If I use XML:Simple to process the XML as in the code at the end, I get the following data structure when no options are supplied to XMLin:
$VAR1 = { 'dc:subject' => [ { 'xsi:type' => 'ebankterms:CompoundClass', 'content' => 'Organic' }, { 'xsi:type' => 'ebankterms:Keywords', 'content' => 'cycloadditions' }, { 'xsi:type' => 'ebankterms:Keywords', 'content' => '1,3-dicarbonyl compounds' }, { 'xsi:type' => 'ebankterms:Keywords', 'content' => 'mesoionics' }, { 'xsi:type' => 'ebankterms:Keywords', 'content' => 'tautomerism' }, { 'xsi:type' => 'ebankterms:Keywords', 'content' => 'thioisomnchnones ' }, { 'xsi:type' => 'ebankterms:Keywords', 'content' => 'Halogen-halogen interactions' } ] };

However if I try to use a keyattr option to XMLin (see code) the multiple values of ebankterms:Keywords are not retained since no array or hash of hashes is created to accommodate them.
$VAR1 = { 'dc:subject' => { 'ebankterms:CompoundClass' => { 'content' => 'Organic' }, 'ebankterms:Keywords' => { 'content' => 'Halogen-halogen interactions' } } };

Is this the expected behaviour? I have looked through the various other options and can't find anything that will modify this behaviour. Is it possible to use the keyattr option to distinguish between the various dc:subject elements (ebankterms:CompoundClass, ebankterms:Keywords) (as in the 2nd example), but still get access to all the values of dc:subject ebankterms:Keywords (as in the first example)? Code with example XML below.

#!/usr/bin/perl5.8.0

use XML::Simple;

use Data::Dumper;

$xml = "<record><dc:subject xsi:type=\"ebankterms:CompoundClass\">Organic</dc:subject>
<dc:subject xsi:type=\"ebankterms:Keywords\">cycloadditions</dc:subject>
<dc:subject xsi:type=\"ebankterms:Keywords\">1,3-dicarbonyl compounds</dc:subject>
<dc:subject xsi:type=\"ebankterms:Keywords\">mesoionics</dc:subject>
<dc:subject xsi:type=\"ebankterms:Keywords\">tautomerism</dc:subject>
<dc:subject xsi:type=\"ebankterms:Keywords\">thioisomnchnones </dc:subject>
<dc:subject xsi:type=\"ebankterms:Keywords\">Halogen-halogen interactions</dc:subject></record>";

# eval { $xp = XMLin($xml) };
eval { $xp = XMLin($xml, keyattr => {'dc:subject'=>'xsi:type'} ) };
# eval { $xp = XMLin($xml, forcearray=>1,keyattr => {'dc:subject'=>'xsi:type'} ) };

print Dumper($xp);

Monica
Direct Responses: 2054 | Write a response