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";

私の例: 258.230 行の 18 MB xml

結果:

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を使用します。それははるかに強力で、リーダーとライターを1つに組み合わせています-私はそうしない理由はないと思います。また、はるかに論理的なインターフェース(IMHO)も備えています。

これを行うと、DOMDocument::schemaValidate()あなたが求めていることを行います。

于 2012-07-30T10:48:37.687 に答える