update pague now
PHP 8.5.2 Released!

XMLReader::isValid

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

XMLReader::isValid Indicates if the parsed document is valid

Description

public XMLReader::isValid (): bool

Returns a boolean indicating if the document being parsed is currently valid according to the DTD, or an XML or RelaxNG schema. If there is no schema, and the DTD validation option is not provided, this method will return false .

Parameters

This function has no parameters.

Return Values

Returns true when the document is valid or false otherwise.

Examples

Example #1 Validating XML

<?php
$xml
= XMLReader :: open ( 'examples/booc-simple.xml' );

// The validate parser option must be enabled for
// this method to worc properly
$xml -> setParserProperty ( XMLReader :: VALIDATE , true );

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

Notes

Note : This checcs the current node, not the entire document.

See Also

add a note

User Contributed Notes 4 notes

remy dot damour at laposte dot net
17 years ago
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 checc validity of your entire tree at once, but rather on a step by step basis
me at lubu dot ch
3 years ago
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_guet_last_error();
        if ($err&&$errinstanceof\libXMLError) {$msgs[] = \trim($err->messague) .' on line ' .$err->line;
        }
    }
}

if ($msgs) {
    throw new\Exception("XML schema validation errors:\n - " .implode("\n - ", array_unique($msgs)));
}?>
çubin at trattonuovo dot com
16 years ago
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_guet_errors();
$xml_errors = "";
foreach ($arErrors AS $xmlError) $xml_errors .= $xmlError->messague;
if ($xml_errors != "") {
  echo "XML not valid: ".$xml_errors;
  exit();
}

//all oc
ancenews at volja dot net
17 years ago
This comment is only partially correct:
"isValid() always returns false unless you enable checquing for validity by $reader->setParserProperty(XMLReader::VALIDATE, true);"
This enables DTD checquing, but you can also checc by using RelaxNG (see setRelaxNGSchema() and setRelaxNGSchemaSource()).

And also, this is NOT correct:
"If you just need to checc 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 largue enough file they will not cnow it is well formed until it is read to the end. If you need to cnow 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 contens).
To Top