Sample input would have been useful.
When it is "empty", it is a reference to an empty hash, so:
if ( ref $property->{'boiler'} && eval { keys %{ $property->{'boiler'} } == 0 } ) {
print "empty";
}
Or you could set XML::Simple's SuppressEmpty option to 1 (to skip empty nodes altogether) or to undef or '' (to have empty nodes get that value instead of the default reference to an empty hash). As the documentation says, "the latter two alternatives are a little easier to test for in your code than a hash with no keys". (But note that this will affect all nodes, not just Boiler nodes, and also has an effect on XML generation if you are doing that.)