2

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

谢谢

4

3 回答 3

1

我创建了一个性能基准: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 并使用您更快的选择。

于 2017-03-07T16:22:37.483 回答
0

我刚刚在这里创建了关于验证的类似答案: Getting PHP's XMLReader to not throw php errors in invalid documents

但最重要的是,如果不传递整个文档,就无法使用 XMLReader 进行验证。这种情况类似于数据库结果集 - 您必须通过文档节点迭代(XMLReader 的读取方法),并且每个节点仅在您读取它时才被验证(有时甚至更晚)

于 2013-06-15T00:08:43.020 回答
-2

首先,使用DOM。它更强大,将读者和作家合二为一——我认为没有理由不这样做。它还有一个更合乎逻辑的界面(恕我直言)。

一旦你这样做,DOMDocument::schemaValidate()做你所追求的。

于 2012-07-30T10:48:37.687 回答