处理 XML 错误

在加载文档时处理 XML 错误是一项非常简单的任务。使用 libxml 功能,可以抑制在加载文档时发生的所有 XML 错误,然后遍历这些错误。

libXMLError 对象(由 libxml_get_errors() 返回)包含多个属性,包括错误的 消息(位置)。

示例 #1 加载损坏的 XML 字符串

<?php
libxml_use_internal_errors
(true);
$sxe = simplexml_load_string("<?xml version='1.0'><broken><xml></broken>");
if (
$sxe === false) {
echo
"Failed loading XML\n";
foreach(
libxml_get_errors() as $error) {
echo
"\t", $error->message;
}
}
?>

上面的示例将输出

Failed loading XML
    Blank needed here
    parsing XML declaration: '?>' expected
    Opening and ending tag mismatch: xml line 1 and broken
    Premature end of data in tag broken line 1

添加注释

用户贡献的注释 4 个注释

openbip at gmail dot com
14 年前
请注意,“if (! $sxe) {" 可能会在 XML 文档为空(例如,“<root />”)时产生假阴性。在这种情况下,$sxe 将为

object(SimpleXMLElement)#1 (0) {
}

它将被评估为 false,即使在技术上没有出错。

建议改为:“if ($sxe === false) {"
1337 at netapp dot com
8 年前
如果您需要处理损坏的 XML 文档的内容,您可能会发现这一点很有趣。它已经帮我解决了几个简单的损坏问题。
https://php.net/manual/en/class.domdocument.php#domdocument.props.recover
tuxedobob
9 年前
现在,/e 修饰符在 preg_replace 中被认为已弃用,您可以使用负向先行来将未转义的和号替换为 &amp;,而不会引发警告

$str = preg_replace('/&(?!;{6})/', '&amp;', $str);

实际上,您可能应该在 /e 已弃用之前就进行此操作。
Jacob Tabak
14 年前
如果您尝试加载包含一些转义和一些未转义的和号的 XML 字符串,您可以预先解析字符串以转义未转义的和号,而不会修改已转义的和号
<?php
$s
= preg_replace('/&[^; ]{0,6}.?/e', "((substr('\\0',-1) == ';') ? '\\0' : '&amp;'.substr('\\0',1))", $s);
?>
To Top