PHP Conference Japan 2024

XMLReader::isValid

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::isValid指示解析的文档是否有效

描述

public XMLReader::isValid(): bool

返回一个布尔值,指示根据 DTD 或 XML 或 RelaxNG 模式,正在解析的文档当前是否有效。如果没有模式,并且没有提供 DTD 验证选项,则此方法将返回false

参数

此函数没有参数。

返回值

当文档有效时返回true,否则返回false

范例

示例 #1 验证 XML

<?php
$xml
= XMLReader::open('test.xml');

// 此方法正常工作需要启用 validate 解析器选项
$xml->setParserProperty(XMLReader::VALIDATE, true);

var_dump($xml->isValid());
?>

备注

注意: 这检查的是当前节点,而不是整个文档。

参见

添加备注

用户贡献的笔记 4 条笔记

remy dot damour at laposte dot net
15 年前
1. 如果您根据 relax-ng 进行验证,则无需调用 $xml->setParserProperty(XMLReader::VALIDATE, true);

2. 请注意,$xml->isValid() 将返回当前活动节点的有效性(即,使用 $xml->read() 定位的节点)。它不会一次检查整个树的有效性,而是在逐步的基础上进行检查。
me at lubu dot ch
2年前
请注意,$xml->isValid() 仅返回当前活动节点的有效性,因此您必须遍历节点。

这是一个根据 XSD 模式验证整个 XML 文件的示例

<?php

$xmlReader
= new \XMLReader();
$xmlReader->open('./example.xml');
$xmlReader->setParserProperty(\XMLReader::VALIDATE, true);
$xmlReader->setSchema('./schema.xsd');

\libxml_use_internal_errors(true);

$msgs = [];

while (
$xmlReader->read()) {
if (!
$xmlReader->isValid()) {
$err = \libxml_get_last_error();
if (
$err && $err instanceof \libXMLError) {
$msgs[] = \trim($err->message) . ' on line ' . $err->line;
}
}
}

if (
$msgs) {
throw new
\Exception("XML schema validation errors:\n - " . implode("\n - ", array_unique($msgs)));
}
?>
zubin at trattonuovo dot com
14 年前
我在使用 isValid 方法和 xml2assoc 函数时遇到了一些问题。
我使用这种方式来验证整个 xml 文件并将其放入关联数组中。

$xml = new XMLReader();
if (!$xml->xml($xml_string, NULL, LIBXML_DTDVALID)) {
echo "XML 无效:加载错误";
exit();
}

libxml_use_internal_errors(TRUE);

$xml_array = xml2assoc($xml);

$arErrors = libxml_get_errors();
$xml_errors = "";
foreach ($arErrors AS $xmlError) $xml_errors .= $xmlError->message;
if ($xml_errors != "") {
echo "XML 无效:".$xml_errors;
exit();
}

//一切正常
anzenews at volja dot net
16 年前
此评论仅部分正确
"isValid() 始终返回 false,除非您通过 $reader->setParserProperty(XMLReader::VALIDATE, true); 启用有效性检查。"
这启用了 DTD 检查,但您也可以使用 RelaxNG 进行检查(参见 setRelaxNGSchema() 和 setRelaxNGSchemaSource())。

而且,这也不正确
"如果您只需要检查 XML 文件是否格式正确,则通常将其成功加载到 XMLReader 对象中就足够了。"
这还不够。拉取解析器在流上操作,如果您有一个足够大的文件,它们在读取到末尾之前不会知道它是否格式正确。如果您需要知道它是否格式正确和/或有效,请将其读取到末尾或验证错误(如果您不关心内容,可以使用 next() 进行快速读取)。
To Top