Чтобы избежать предупреждений PHP в процессе проверки схемы, можно использовать libxml_use_internal_errors(true);
, а также libxml_get_errors()[0] -> message;
«вручную» администрировать возможные сообщения об ошибках валидации. Это работает, когда это XML, который не соответствует схеме, но предупреждение все еще выдается, когда сама схема недопустима.
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 ‘: содержание
не является действительным. Ожидается (аннотация ?, (simpleContent |
complexContent | ((группа | все | выбор | последовательность) ?, ((атрибут |
attributeGroup) *, anyAttribute?))))
Недопустимая схема (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>
Это то, что я ожидал бы случиться. Согласно документации, DOMDocument :: schemaValidate проверяет документ на основе схемы. Следовательно, если сама схема недействительна, ее нельзя использовать для проверки документа.
Вы можете попробовать и префикс команды с @ — см. http://php.net/manual/en/language.operators.errorcontrol.php. Это должно подавить предупреждение, позволяющее вашему коду продолжить работу. Если это не сработает, вы можете попытаться временно отключить отчеты об ошибках, используя error_reporting (0) (http://php.net/manual/en/function.error-reporting.php) перед вызовом DOMDocument :: schemaValidate. Затем восстановите предыдущий параметр, который был бы возвращен при вызове error_reporting (0).
Других решений пока нет …