PHP Conference Japan 2024

处理 XML 错误

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

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

示例 #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

添加注释

用户贡献的注释 3 条注释

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

object(SimpleXMLElement)#1 (0) {
}

这将评估为 false,即使在技术上没有任何错误。

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

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

实际上,您可能应该在 /e 被弃用之前就这样做。
To Top