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