XMLReader()中的XML验证

时间:2012-07-30 09:41:27

标签: php xml xsd xmlreader

我一直在尝试研究如何在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

由于

3 个答案:

答案 0 :(得分:1)

我创建了一个Performance-Benchmark:XML​​Reader 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()将完成您的工作。