2012-07-30 126 views
1

我一直在努力解決如何在PHP中驗證XSD與XSD的關係,但是由於缺少示例而未能這樣做。我讀過is_Valid()XMLReader中的XML驗證()

我想到了下面的例子,但它不能正常工作。

$reader = new XMLReader(); 
$reader->open('items.xml'); 
$reader->setSchema('items.xsd'); 

//Now how do validate against XSD and print errors here 

感謝

回答

0

首先,使用DOM。它更強大,將讀者和作者融爲一體 - 我認爲沒有理由不這樣做。它也有更多的邏輯接口(恕我直言)。

一旦你這樣做,DOMDocument::schemaValidate()做你以後。

+0

我無法使用DOM,因爲我的XML文件很大,DOM無法處理。 – BentCoder 2012-07-30 11:50:19

+1

@DaveRandom DOM功能強大,但該功能需要花費。這兩種工具都有完全不同的用例,並且以各自的方式強大。與XMLReader相比,dom非常昂貴。 DOM會將整個文檔加載到內存中。 XMLReader使您能夠更高效地讀取文檔,並且可以在需要時將單個節點加載到dom中。您將能夠獲得更好的性能並節省(可能性很大)的資源。對於處理較小XML文件的應用程序也是如此。 「正確的」選擇取決於要求。兩者都不是「更好」。 – 2015-05-28 00:30:21

0

我剛剛創建關於確認這裏類似的答案: Getting PHP's XMLReader to not throw php errors in invalid documents

但最重要的事情是,你無法驗證使用的XMLReader不經過整個文檔。這種情況類似於數據庫結果集 - 您必須通過文檔節點迭代(讀取XMLReader的方法),並且每個節點僅在您讀取時進行驗證(有時甚至更晚)

+0

我用'set_error_handler('validation_error_handler',E_WARNING);'和手動處理錯誤,工作正常。 – BentCoder 2013-06-18 13:28:58

0

我創建了性能基準測試: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個字節

DOM文檔 - 483.04295539856毫秒,369280個字節

所以我決定去與DOM文檔,只是用自己的XML和XSD嘗試並使用你的更快的選擇。