Избегайте XML-предупреждений DOMDocument в php

Я извлекаю xml-файлы с сервера, а иногда получаю недопустимые файлы xml, из-за этого я получаю предупреждение:

Warning: DOMDocument::load() [domdocument.load]: Start tag expected, '<' not found in 

Как я могу поймать это предупреждение и удалить файл?

У вас есть два варианта. Либо используйте оператор управления ошибкой @ в вызове load() , например, @$dom->load() , что несколько медленнее, потому что оно глобально изменяет значение display_errors на off, выполняет функцию и устанавливает ее обратно.

Другой вариант, который я лично предпочитаю (я ненавижу оператора @ , я не могу его видеть в своем коде) заключается в том, чтобы сохранить старое значение libxml_use_internal_errors , включить его с помощью libxml_use_internal_errors(TRUE) , вызвать функцию, очистить буфера ошибок и восстановить старое значение. Вот фрагмент моего кода, который делает это:

 <?php $previous_value = libxml_use_internal_errors(TRUE); $doc->loadHTML((string)$e->response->getBody()); libxml_clear_errors(); libxml_use_internal_errors($previous_value); 

Я еще не могу комментировать ответы, поэтому напишу здесь:

  • Майкл делает его менее строгим, но он по-прежнему выдаст предупреждения для некоторых ошибок:
 nadav @ shesek: ~ $ php -r '$ dom = новый DOMDocument;  $ dom-> strictErrorChecking = FALSE;  $ Dom-> loadHTML ( "<х> </ ге>");»
 PHP Предупреждение: DOMDocument :: loadHTML (): тег xy недействителен в Entity, строка: 1 в поле командной строки в строке 1
  • НЕ делайте то, что предложил Фран-Верона, – глобальное отключение сообщений об ошибках – это то, чего вы никогда не должны делать. В процессе производства установите свой собственный обработчик ошибок и отобразите более красивое сообщение пользователю и убедитесь, что ошибка где-то зарегистрирована, но никогда не отключите его полностью. Установка error_reporting на 0 приведет к тому, что PHP также отключит ведение журнала ошибок.
  • Решение Xeon06 проблематично, потому что вы выполняете весь обработчик ошибок сценария для определенной части кода. Использование собственного обработчика ошибок, который просто игнорирует ошибку, вызывает те же проблемы, что и решение Франса.

Используйте set_error_handler .

 set_error_handler("yourHandler", E_WARNING); 

Отключите строгую проверку ошибок:

 $dom = new DOMDocument(); $dom->strictErrorChecking = FALSE ; $dom->load('/path/to/file.xml'); if (!$dom->validate()) { // Invalid XML! }