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