2015-10-20 59 views
4

爲避免模式驗證過程中的PHP警告,可以使用libxml_use_internal_errors(true);libxml_get_errors()[0] -> message;「手動」管理最終的驗證錯誤消息。這適用於XML與模式不匹配的情況,但當模式本身無效時仍會觸發警告。如何在架構無效時禁用DOMDocument :: schemaValidate()生成的警告?

libxml_use_internal_errors(true);已經捕獲了返回的錯誤數組中的錯誤消息,警告似乎對我來說是多餘的,任何方式來繞過/禁用此特定的警告?

我在嚴格模式下工作,所以當警告激發時停止執行,並將錯誤記錄到數據庫中,問題在於PHP警告過於模糊,所以我想繞過它來報告libxml錯誤在單獨的日誌記錄系統中,然後查看詳細的錯誤。

此警告是否爲正確行爲?有沒有可能是一個錯誤?


的PHP代碼:

<?php 
    $DD = new DOMDocument('1.0', 'ISO-8859-1'); 
    $DD -> loadXML('<?xml version ="1.0" encoding="ISO-8859-1"?><a></a>'); 
    libxml_use_internal_errors(true); // NO LIBXML WARNINGS 
    $DD -> schemaValidate(__DIR__ . '/schema.xsd'); // Vague WARNING 
    $errors = libxml_get_errors(); 

    if (isset($errors[0])) { 
     echo $errors[0] -> message; // Libxml detailed message 
    } 
?> 

PHP的警告:

的DOMDocument :: schemaValidate():無效的架構


的libxml的詳細的錯誤消息:

元素 '{} http://www.w3.org/2001/XMLSchema的complexType':內容 無效。所預期的那樣(註釋?(簡單文本| 複雜內容|((組|全部|選|序列)?((屬性| attributeGroup)*,anyAttribute)))?)


無效schema(schema.xsd):

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xs:schema 
    targetNamespace="http://www.lala.com/la" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:la="http://www.lala.com/la" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified" 
> 
    <xs:element name="foo"> 
     <xs:complexType> 
      <xs:element ref="bar"/><!-- lacking <sequence> parent --> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

回答

1

這是我期望發生的事情。根據文檔,DOMDocument :: schemaValidate根據模式驗證文檔。因此,如果模式本身無效,則不能用於驗證文檔。

您可以嘗試在@前綴命令 - 請參閱http://php.net/manual/en/language.operators.errorcontrol.php。這應該禁止警告讓您的代碼繼續。如果這不起作用,則可以在調用DOMDocument :: schemaValidate之前嘗試使用error_reporting(0)(http://php.net/manual/en/function.error-reporting.php)臨時禁用錯誤報告。然後,恢復在調用error_reporting(0)時返回的先前設置。

+1

問題是它將禁用任何警告。理想的解決方案是檢查模式是否作爲先前的步驟是有效的,但看起來在使用它之前沒有任何檢查模式的函數,唯一的解決方案似乎是通過某種防彈措施來實現該功能您建議的@運算符,以精確檢測模式是否有效,而不會將該方面與其他類型的libxml錯誤或PHP警告混淆。 – mikl