使用此方法验证文档时,有两个问题我不喜欢。首先,它会创建一堆警告,这是人们不希望看到的,因为调用此方法的目的是防止在错误地依赖文档的有效性时可能出现的任何警告。其次,它只返回一个布尔值,没有机会获得有关无效原因的更多详细信息。
这就是我使用一个小包装器的原因,我在这里发布它,以防有人发现它有用。
请注意,它只适用于 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 或纯文本),无论如何
此致,
Anja