$|=1;
use XML::Rules;
$xml = <<'*END*';
<school>
<classes name="Primary">
<student name="Junkman">
<Age>12</Age>
</student>
<student name="Lotman">
<Age>14</Age>
</student>
</classes>
<classes name="Nursery">
<student name="Testman">
<Age>34</Age>
</student>
</classes>
<classes name="SomeClass">
</classes>
</school>
*END*
my $parser = new XML::Rules (
rules => [
_default => 'raw',
classes => sub {
if ($_[1]->{name} eq 'SomeClass') {
if (ref($_[1]->{_content})) {
push @{$_[1]->{_content}}, $_[4]->{parameters}
} else {
$_[1]->{_content} = [ $_[1]->{_content}, $_[4]->{parameters}];
# there were no students in the class, the tag contained only the whitespace
}
}
return [$_[0] => $_[1]]
},
]);
my $result = $parser->parsestring($xml, [student => {name => 'Johny', age => {_content => 25}}]);
print $parser->toXML(@$result);