我一直在尝试研究如何在 PHP 中针对 XSD 验证 XML,但由于缺乏示例而未能这样做。我读过is_Valid()等。
我想出了下面的例子,但它不能正常工作。
$reader = new XMLReader();
$reader->open('items.xml');
$reader->setSchema('items.xsd');
//Now how do validate against XSD and print errors here
谢谢
我创建了一个性能基准:XMLReader vs DOMDocument
XMLReader.php:
$script_starttime = microtime(true);
libxml_use_internal_errors(true);
$xml = new XMLReader;
$xml->open($_FILES["file"]["tmp_name"]);
$xml->setSchema($xmlschema);
while (@$xml->read()) {};
if (count(libxml_get_errors ())==0) {
echo 'good';
} else {
echo 'error';
}
echo '<br><br>Time: ',(microtime(true) - $script_starttime)*1000," ms, Memory: ".memory_get_usage()." bytes";
DOMDocument.php:
$script_starttime = microtime(true);
libxml_use_internal_errors(true);
$xml = new DOMDocument();
$xmlfile = $_FILES["file"]["tmp_name"];
$xml->load($xmlfile);
if ($xml->schemaValidate($xmlschema)) {
echo 'good';
} else {
echo 'error';
}
echo '<br><br>Time: ',(microtime(true) - $script_starttime)*1000," ms, Memory: ".memory_get_usage()." bytes";
我的示例:18 MB xml,258.230 行
结果:
XMLReader - 656.14199638367 毫秒,379064 字节
DOMDocument - 483.04295539856 毫秒,369280 字节
所以我决定使用 DOMDocument,但只需尝试使用您自己的 xml 和 xsd 并使用您更快的选择。
我刚刚在这里创建了关于验证的类似答案: Getting PHP's XMLReader to not throw php errors in invalid documents
但最重要的是,如果不传递整个文档,就无法使用 XMLReader 进行验证。这种情况类似于数据库结果集 - 您必须通过文档节点迭代(XMLReader 的读取方法),并且每个节点仅在您读取它时才被验证(有时甚至更晚)
首先,使用DOM。它更强大,将读者和作家合二为一——我认为没有理由不这样做。它还有一个更合乎逻辑的界面(恕我直言)。
一旦你这样做,DOMDocument::schemaValidate()
做你所追求的。