use strict;
use warnings;
use XML::Xerces;

my $validate = 1;
my $in;
while (<>) {
      $in .= $_;
}

if (my $doc = getDocument($in, $validate)) {
  XML::Xerces::DOMParse::unformat ($doc);
  XML::Xerces::DOMParse::format ($doc);
  XML::Xerces::DOMParse::print (\*STDOUT, $doc);
  print "\n";
}
  
sub getDocument {
    my $xmlstring = shift or die "XML string not supplied";
    my $validate  = shift;

    my $parser = XML::Xerces::DOMParser->new();
#   $parser->setValidationScheme($XML::Xerces::DOMParser::Val_Never);
#   $parser->setToCreateXMLDeclTypeNode(1); - gives deprecated message
    $parser->setDoNamespaces(0);
    $parser->setCreateEntityReferenceNodes(1);
    $parser->setDoSchema(0);
    if ($validate) {
        $parser->setValidationScheme($XML::Xerces::DOMParser::Val_Always);
    }

    my $error_handler = XML::Xerces::PerlErrorHandler->new();
    $parser->setErrorHandler($error_handler);

    my $inputsource = XML::Xerces::MemBufInputSource->new($xmlstring);

    eval {
        $parser->parse($inputsource);
    };
    if ($@) {
        warn "Parse Error: ".(ref ($@) ? $@->getMessage : $@);
	return;
    }

    return $parser->getDocument();
}

