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
"載入 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 則筆記

22
openbip at gmail dot com
14 年前
請注意,如果 XML 文件為空(例如 "<root />"),則「if (! $sxe) {」可能會給您錯誤的否定結果。在這種情況下,$sxe 將會是

object(SimpleXMLElement)#1 (0) {
}

這會評估為 false,即使技術上沒有任何錯誤發生。

請改為考慮:「if ($sxe === false) {」
2
1337 at netapp dot com
9 年前
如果您需要處理損壞的 XML 文件的內容,您可能會發現這很有趣。它已經通過了一些簡單的損壞情況。
https://php.dev.org.tw/manual/en/class.domdocument.php#domdocument.props.recover
4
tuxedobob
10 年前
既然在 preg_replace 中 /e 修飾符被視為已棄用,您可以使用負向預查來將未逸出的 & 符號替換為 &amp;,而不會拋出警告

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

實際上,您可能在 /e 被棄用之前就應該這樣做了。
To Top