文字

XMLReader::isValid

(PHP 5 >= 5.1.0)

XMLReader::isValidIndicates if the parsed document is valid

说明

public bool XMLReader::isValid ( void )

Returns a boolean indicating if the document being parsed is currently valid.

返回值

成功时返回 TRUE , 或者在失败时返回 FALSE

范例

Example #1 Validating XML

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

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

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

注释

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

参见

  • XMLReader::setParserProperty() - Set parser options
  • XMLReader::setRelaxNGSchema() - Set the filename or URI for a RelaxNG Schema
  • XMLReader::setRelaxNGSchemaSource() - Set the data containing a RelaxNG Schema
  • XMLReader::setSchema() - Validate document against XSD

用户评论:

[#1] zubin at trattonuovo dot com [2010-01-20 03:00:33]

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

[#2] remy dot damour at laposte dot net [2008-12-31 03:27:52]

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

[#3] anzenews at volja dot net [2008-01-22 10:50:35]

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).

上一篇: 下一篇: