Как отключить предупреждение, генерируемое DOMDocument :: schemaValidate (), когда схема недопустима?

Чтобы избежать предупреждений 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>

4

Решение

Это то, что я ожидал бы случиться. Согласно документации, 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).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]