我一直在尝试研究如何在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
由于
答案 0 :(得分:1)
我创建了一个Performance-Benchmark: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 ms,379064 bytes
DOMDocument - 483.04295539856 ms,369280 bytes
所以我决定使用DOMDocument,但只需使用自己的xml和xsd进行尝试,并使用更快的选择。
答案 1 :(得分:0)
我刚刚在这里创建了类似的验证答案: Getting PHP's XMLReader to not throw php errors in invalid documents
但最重要的是,如果不传递整个文档,就无法使用XMLReader进行验证。情况类似于数据库结果集 - 您必须通过文档节点迭代(读取XMLReader的方法),并且只有在您阅读它时(有时甚至更晚)才验证每个节点
答案 2 :(得分:-1)
首先,使用DOM。它更加强大,将读者和作者混合在一起 - 我认为没有理由不这样做。它还有一个更合理的界面(恕我直言)。
执行此操作后,DOMDocument::schemaValidate()
将完成您的工作。