DOMDocument::validate

(PHP 5, PHP 7, PHP 8)

DOMDocument::validate根据其 DTD 验证文档

描述

public DOMDocument::validate(): bool

根据其 DTD 验证文档。

您也可以使用 DOMDocumentvalidateOnParse 属性进行 DTD 验证。

参数

此函数没有参数。

返回值

成功时返回 true,失败时返回 false。如果文档没有附加 DTD,此方法将返回 false

示例

示例 #1 DTD 验证示例

<?php
$dom
= new DOMDocument;
$dom->load('book.xml');
if (
$dom->validate()) {
echo
"此文档有效!\n";
}
?>

您也可以在加载 XML 文件时验证它

<?php
$dom
= new DOMDocument;
$dom->validateOnParse = true;
$dom->load('book.xml');
?>

参见

添加注释

用户贡献的注释 3 个注释

11
a dot schaffhirt at sedna-soft dot de
15 年前
使用此方法验证文档时,有两个问题我不喜欢。首先,它会创建一堆警告,这是人们不希望看到的,因为调用此方法的目的是防止在错误地依赖文档的有效性时可能出现的任何警告。其次,它只返回一个布尔值,没有机会获得有关无效原因的更多详细信息。

这就是我使用一个小包装器的原因,我在这里发布它,以防有人发现它有用。

请注意,它只适用于 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
// $doc 是一个 DOMDocument 对象
$myDoc = new MyDOMDocument($doc); // 复制构造函数

// 对 $myDoc 执行与对 $doc 相同的操作

$isValid = $myDoc->validate(); // 不会创建警告
if (!$isValid) {
print_r($myDoc->errors); // 所有收集到的警告数组
}
?>

您可能需要更改以下部分
preg_replace("/^.+: */", "", $pString)
为其他内容,具体取决于您的系统错误报告设置(HTML 或纯文本),无论如何

此致,

Anja
2
cabral dot brc at gmail dot com
13 年前
我试图验证我的 SVG 文件只是为了使用 getElementById() 获取 ID,

<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<text id="text_titulo" x="150" y="20" font-family="Arial" font-size="15px" style="font-weight:bold;">标题</text>
<text id="text_subtitulo" x="200" y="35" font-family="Arial" font-size="10px">副标题</text>
<g transform="translate(0,50) scale(0.1)">
<a id="a_AC" ...... >
<polygon id="polygon_AC" ....... />
</a>
</g>
</svg>

但是当调用 $dom->load() 时,会收到 "failed to open stream" 和 "Validation failed: no DTD found !I/O warning : failed to load external entity" 错误。
因此,我创建了自己的验证包装器(我只想用 getElementById() 找到 ID)。

<?php
$docSVG
= new DOMDocument();
$docSVG->load(realpath($filepath));
setAllId($docSVG);


function
setAllId($DOMNode){
if(
$DOMNode->hasChildNodes()){
foreach (
$DOMNode->childNodes as $DOMElement) {
if(
$DOMElement->hasAttributes()){
$id=$DOMElement->getAttribute("id");
if(
$id){
$DOMElement->setIdAttribute("id",$id);
}
}
setAllId($DOMElement);
}
}
}
?>
-6
darren at viamedia dot co dot za
16 年前
如果您要加载 XML 并打算根据内部 DTD 进行验证,并且您在验证过程中遇到了问题,这可能与缺少 LIBXML 常量有关。

我在根级 DOM 文档中找到了“aidan at php dot net”发布的这篇文章,我认为它可能在这里更有用。
从 PHP 5.1 开始,可以使用常量而不是专有的 DomDocument 属性来设置 libxml 选项。

DomDocument->resolveExternals 等效于设置
LIBXML_DTDLOAD
LIBXML_DTDATTR

DomDocument->validateOnParse 等效于设置
LIBXML_DTDLOAD
LIBXML_DTDVALID

鼓励 PHP 5.1 用户使用新的常量。

示例
<?php
$dom
= new DOMDocument;
// 解析外部文件
$dom->load($file, LIBXML_DTDLOAD|LIBXML_DTDATTR);
// 或者
// 对 DTD 进行验证
$dom->load($file, LIBXML_DTDLOAD|LIBXML_DTDVALID);
$dom->validate();
?>
To Top