XMLReader::isValid

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

XMLReader::isValid β€” Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, содСрТит Π»ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ синтаксичСскиС ошибки

ОписаниС

public function XMLReader::isValid(): bool

ΠœΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, соотвСтствуСт Π»ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ схСмС DTD, XML ΠΈΠ»ΠΈ RelaxNG. ΠœΠ΅Ρ‚ΠΎΠ΄ Π²Π΅Ρ€Π½Ρ‘Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false, Ссли схСму Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΈ ΠΎΠΏΡ†ΠΈΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ DTD Π½Π΅ ΡƒΠΊΠ°Π·Π°Π»ΠΈ.

Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

Π‘ΠΈΠ³Π½Π°Ρ‚ΡƒΡ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ содСрТит ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния

ΠœΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ссли Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π½Π΅ содСрТит синтаксичСских ошибок, ΠΈΠ½Π°Ρ‡Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ XML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°

<?php

$xml
= XMLReader::open('examples/book-simple.xml');

// Для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° потрСбуСтся Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ
// ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ парсСра
$xml->setParserProperty(XMLReader::VALIDATE, true);

var_dump($xml->isValid());

?>

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠœΠ΅Ρ‚ΠΎΠ΄ провСряСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΠ·Π΅Π», Π° Π½Π΅ вСсь Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅

  • XMLReader::setParserProperty() - УстанавливаСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ парсСра
  • XMLReader::setRelaxNGSchema() - УстанавливаСт имя Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ URI для схСмы RelaxNG
  • XMLReader::setRelaxNGSchemaSource() - УстанавливаСт Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат схСму RelaxNG
  • XMLReader::setSchema() - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Ρ‡Π΅Ρ€Π΅Π· схСму XSD
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 4 notes

up
3
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 check validity of your entire tree at once, but rather on a step by step basis
up
1
me at lubu dot ch ΒΆ
4 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_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)));
}
?>
up
0
zubin 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_get_errors();
$xml_errors = "";
foreach ($arErrors AS $xmlError) $xml_errors .= $xmlError->message;
if ($xml_errors != "") {
  echo "XML not valid: ".$xml_errors;
  exit();
}

//all ok
up
0
anzenews at volja dot net ΒΆ
18 years ago
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).