protected function clearXML($xml)
{
$xml = str_replace("\r", "\n", $xml);
$xml = str_replace(array('xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'), '', $xml);
$xml = preg_replace('~xsi:[a-z]+="[^"]+"~msi', '', $xml);
$xml = preg_replace("/" . preg_quote('<![CDATA[', '/') . "(.*?)" . preg_quote(']]>', '/') . "/mis", "\\1", $xml);
$xml = str_replace('&', '', $xml);
$dom = new \DOMDocument();
if (!$dom->loadXML($xml)) {
file_put_contents("d.xml", $xml);
}
$fix = function ($str) {
$str = trim($str);
// period
if (preg_match("/^P([0-9]+[A-Z])+/", $str) || preg_match("/^PT([0-9]+[A-Z])+\$/", $str)) {
$str = str_replace("N", "D", $str);
while (preg_match("/P0+[A-Z]/", $str)) {
$str = preg_replace("/P0+[A-Z]/", "P", $str);
//P0D => P
}
while (preg_match("/T0+[A-Z]/", $str)) {
$str = preg_replace("/T0+[A-Z]/", "T", $str);
//T0H => T
}
if ($str[strlen($str) - 1] == "T") {
$str = substr($str, 0, -1);
}
}
// boolean
$str = str_replace(['true', 'false'], ['1', '0'], $str);
// 'true' => '1'
// datetime
$str = str_replace(array('+00:00', '-05:00'), '', $str);
$str = preg_replace('/Z$/', '', $str);
// number
if (is_numeric($str) && strpos($str, '.') !== false) {
$str = floatval($str);
} elseif (is_numeric($str)) {
$str = intval($str);
} else {
$str = preg_replace('/\\.0+$/', '', $str);
// 1.0000 => 1, .0 => ''
}
return $str;
};
$xp = new \DOMXPath($dom);
do {
$comments = $xp->query("//comment()|//text()[normalize-space()='']");
$l = $comments->length;
foreach ($comments as $comment) {
$comment->parentNode->removeChild($comment);
}
} while ($l);
foreach ($xp->query("//@*") as $attr) {
$attr->value = $fix($attr->value);
}
foreach ($xp->query("//text()") as $text) {
$text->data = $fix($text->data);
}
$dom->formatOutput = true;
$dom->preserveWhitespace = true;
return $dom->saveXML();
}