若要從 DOMDocument::schemaValidate 取得更詳細的回饋,請停用 libxml 錯誤並自行提取錯誤資訊。請參閱 https://php.dev.org.tw/manual/en/ref.libxml.php 以取得更多資訊。
example.xml
<?xml version="1.0"?>
<example>
<child_string>This is an example.</child_string>
<child_integer>Error condition.</child_integer>
</example>
example.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="example">
<xs:complexType>
<xs:sequence>
<xs:element name="child_string" type="xs:string"/>
<xs:element name="child_integer" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<?php
function libxml_display_error($error)
{
$return = "<br/>\n";
switch ($error->level) {
case LIBXML_ERR_WARNING:
$return .= "<b>Warning $error->code</b>: ";
break;
case LIBXML_ERR_ERROR:
$return .= "<b>Error $error->code</b>: ";
break;
case LIBXML_ERR_FATAL:
$return .= "<b>Fatal Error $error->code</b>: ";
break;
}
$return .= trim($error->message);
if ($error->file) {
$return .= " in <b>$error->file</b>";
}
$return .= " on line <b>$error->line</b>\n";
return $return;
}
function libxml_display_errors() {
$errors = libxml_get_errors();
foreach ($errors as $error) {
print libxml_display_error($error);
}
libxml_clear_errors();
}
// 啟用使用者錯誤處理
libxml_use_internal_errors(true);
$xml = new DOMDocument();
$xml->load('example.xml');
if (!$xml->schemaValidate('example.xsd')) {
print '<b>DOMDocument::schemaValidate() 產生錯誤!</b>';
libxml_display_errors();
}
?>
舊錯誤訊息
警告:DOMDocument::schemaValidate() [function.schemaValidate]:元素 'child_integer':'Error condition.' 不是原子類型 'xs:integer' 的有效值。在 example.php 第 40 行
新錯誤訊息
DOMDocument::schemaValidate() 產生錯誤!
錯誤 1824:元素 'child_integer':'Error condition.' 不是原子類型 'xs:integer' 的有效值。在 example.xml 第 4 行