使用此方法驗證文件時,有兩個我不喜歡的問題。首先,它會產生一堆警告,這是不會預期的,因為呼叫此方法的目的是為了防止在錯誤地依賴文件的有效性時可能發生的任何警告。其次,它只會傳回布林值,而無法取得關於呈現為無效原因的額外詳細資訊。
這就是我使用一個小包裝函式的原因,我將其張貼在這裡,以防有人發現它有用。
請注意,它僅適用於 PHP5 或更新版本。
<?php
class MyDOMDocument {
private $_delegate;
private $_validationErrors;
public function __construct (DOMDocument $pDocument) {
$this->_delegate = $pDocument;
$this->_validationErrors = array();
}
public function __call ($pMethodName, $pArgs) {
if ($pMethodName == "validate") {
$eh = set_error_handler(array($this, "onValidateError"));
$rv = $this->_delegate->validate();
if ($eh) {
set_error_handler($eh);
}
return $rv;
}
else {
return call_user_func_array(array($this->_delegate, $pMethodName), $pArgs);
}
}
public function __get ($pMemberName) {
if ($pMemberName == "errors") {
return $this->_validationErrors;
}
else {
return $this->_delegate->$pMemberName;
}
}
public function __set ($pMemberName, $pValue) {
$this->_delegate->$pMemberName = $pValue;
}
public function onValidateError ($pNo, $pString, $pFile = null, $pLine = null, $pContext = null) {
$this->_validationErrors[] = preg_replace("/^.+: */", "", $pString);
}
}
?>
<?php
$myDoc = new MyDOMDocument($doc); $isValid = $myDoc->validate(); if (!$isValid) {
print_r($myDoc->errors); }
?>
您可能需要變更部分
preg_replace("/^.+: */", "", $pString)
根據您系統的錯誤報告設定(HTML 或純文字)等,變更為其他內容
此致,
安雅