我有通过 PHP 自动缩进 XML 的代码:
function xmlpp($xml, $html_output=false) {
if ($xml == '') return 'NULL';
try {
$xml_obj = @new SimpleXMLElement($xml);
} catch (Exception $ex) {
// Error parsing xml, return same string
return ($html_output) ? htmlentities($xml) : $xml;
}
$level = 4;
$indent = 0; // current indentation level
$pretty = array();
// get an array containing each XML element
$xml = explode("\n", preg_replace('/>\s*</', ">\n<", $xml_obj->asXML()));
// shift off opening XML tag if present
if (count($xml) && preg_match('/^<\?\s*xml/', $xml[0])) {
//$pretty[] = array_shift($xml);
array_shift($xml);
}
foreach ($xml as $el) {
if (preg_match('/^<([\w])+[^>\/]*>$/U', $el)) {
// opening tag, increase indent
$pretty[] = str_repeat(' ', $indent) . $el;
$indent += $level;
} else {
if (preg_match('/^<\/.+>$/', $el)) {
$indent -= $level; // closing tag, decrease indent
}
if ($indent < 0) {
$indent += $level;
}
$pretty[] = str_repeat(' ', $indent) . $el;
}
}
$xml = implode("\n", str_replace('"', "'", $pretty));
return ($html_output) ? htmlentities($xml, ENT_COMPAT, 'UTF-8') : $xml;
}
问题是每当我得到一个包含/
字符的属性值时,缩进级别就会降低。例如,为以下内容生成的输出不正确:
<function desc='Cancel/Refund'>
<const value='1'/>
<const value='1'/>
<const value='1'/>
</function>
我知道正则表达式不应该与 Cancel/Refud 匹配,但它确实如此,我不知道如何解决这个问题。
任何提示将不胜感激。