Search code examples
xmlperlxml-simple

Perl XML::Simple: SuppressEmpty for xsi:nil-Elements without content?


I'm struggling with XML::Simple in Perl and nullable Elements.

So this is my example-XML:

<MyXml>
    <SomeNumber>123</SomeNumber>
    <EmptyOne/>
    <NullableElement xsi:nil="true"></NullableElement>
</MyXml>

If I read this with XMLin and SuppressEmpty => 1 I'll get an empty string for the EmptyOne, but a Hash with xsi:nil="true" for the NullableElement. My questions is, how can I tell the XMLin to ignore the xsi:nil-Content and just give me an empty string or undef? Is this even possible with XML::Simple or should I switch to Lib::XML?

Here some code to see the result:

use XML::Simple;
use Data::Dumper;

my $xmlIn = '<MyXml><SomeNumber>123</SomeNumber><EmptyOne/><NullableElement xsi:nil="true"></NullableElement></MyXml>';
my $xmlHash = XMLin($xmlIn, SuppressEmpty => '');

print Dumper($xmlHash);

Solution

  • Well I found a solution for my problem by myself, but this only works for my specific case, because I don't have any attributes I need. If so, you can change the line

    my $xmlHash = XMLin($xmlIn, SuppressEmpty => '');
    

    to

    my $xmlHash = XMLin($xmlIn, NoAttr => 1, SuppressEmpty => '');
    

    This will cut off all the attributes and return an empty string like a regular empty Element.

    As mentioned before, this will only work if you don't need any attributes from the xml. If you do need them, this won't work.