XMLReader::isValid
(PHP 5 >= 5.1.2)
XMLReader::isValid — Indicates if the parsed document is valid
Описание
bool XMLReader::isValid
( void
)
Returns a boolean indicating if the document being parsed is currently valid.
Возвращаемые значения
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
Примеры
Пример #1 Validating XML
<?php
$xml = XMLReader::open('test.xml');
// You must to use it
$xml->setParserProperty(XMLReader::VALIDATE, true);
var_dump($xml->isValid());
?>
- Функция XMLReader::close() - Закрыть ввод XMLReader
- Функция XMLReader::expand() - Возвратить копию текущего узла в виде объекта DOM
- Функция XMLReader::getAttribute() - Получить значение атрибута с определённым именем
- Функция XMLReader::getAttributeNo() - Получить значение атрибута по индексу
- Функция XMLReader::getAttributeNs() - Получить значение атрибута по localname и URI
- Функция XMLReader::getParserProperty() - Указывает, было ли определенное свойство установлено
- Функция XMLReader::isValid() - Показать, является ли разбираемый документ синтаксически правильным
- Функция XMLReader::lookupNamespace() - Найти пространство имён для префикса
- Функция XMLReader::moveToAttribute() - Переместить курсор к атрибуту с заданным именем
- Функция XMLReader::moveToAttributeNo() - Переместить курсор на атрибут по индексу
- Функция XMLReader::moveToAttributeNs() - Переместить курсор к именованному атрибуту
- Функция XMLReader::moveToElement() - Позиционировать курсор на родительском элементе текущего атрибута
- Функция XMLReader::moveToFirstAttribute() - Переместить позицию курсора на первый атрибут
- Функция XMLReader::moveToNextAttribute() - Переместить позицию курсора на следующий атрибут
- Функция XMLReader::next() - Переместить курсор на следующий узел, пропуская все поддеревья
- Функция XMLReader::open() - Установить URI, содержащий XML-документ для разобора
- Функция XMLReader::read() - Переместиться к следующему узлу в документе
- Функция XMLReader::readInnerXML() - Извлечь XML из текущего узла
- Функция XMLReader::readOuterXML() - Получить XML из текущего узла, включая сам узел
- Функция XMLReader::readString() - Прочитать содержимое текущего узла как строку
- Функция XMLReader::setParserProperty() - Устанавливает опцию парсера
- Функция XMLReader::setRelaxNGSchema() - Устанавить имя файла или URI для схемы RelaxNG
- Функция XMLReader::setRelaxNGSchemaSource() - Устанавливает данные, содержащие схему RelaxNG
- Функция XMLReader::setSchema() - Проверить документ, используя XSD
- Функция XMLReader::XML() - Установить данные, содержащие XML для разбора
Коментарии
This comment is only partially correct:
"isValid() always returns false unless you enable checking for validity by $reader->setParserProperty(XMLReader::VALIDATE, true);"
This enables DTD checking, but you can also check by using RelaxNG (see setRelaxNGSchema() and setRelaxNGSchemaSource()).
And also, this is NOT correct:
"If you just need to check if XML file is well formed, successful loading into XMLReader object is usually enough."
It is not enough. Pull parsers operate on stream and if you have a large enough file they will not know it is well formed until it is read to the end. If you need to know if it is well formed or/and valid, read it till the end or validation error (you can use next() for fast reading if you don't care about contents).
1. If you validate against relax-ng, no need to call $xml->setParserProperty(XMLReader::VALIDATE, true);
2. Be aware that $xml->isValid() will return validity for currently active node (ie. node currently positioned using $xml->read()). It won't check validity of your entire tree at once, but rather on a step by step basis
I encountered some problems to use isValid method with xml2assoc function.
I use this way to validate the entire xml file and put it into an associative array.
$xml = new XMLReader();
if (!$xml->xml($xml_string, NULL, LIBXML_DTDVALID)) {
echo "XML not valid: load error";
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 not valid: ".$xml_errors;
exit();
}
//all ok
Be aware that $xml->isValid() will return validity only for currently active node, so you have to loop trough the nodes.
Here is a example how to validate a entire XML file against a XSD schema:
<?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)));
}
?>