Избегайте предупреждений DOMDocument XML в php - PullRequest
11 голосов
/ 16 августа 2011

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

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

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

Ответы [ 3 ]

39 голосов
/ 16 августа 2011

У вас есть два варианта.В вашем вызове 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);

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

  • Решение от Michael делает его меньшестрогий, но он все равно выдаст предупреждения для некоторых ошибок:
nadav@shesek:~$ php -r '$dom=new DOMDocument; $dom->strictErrorChecking = FALSE ; $dom->loadHTML("<xy></zx>");'
PHP Warning:  DOMDocument::loadHTML(): Tag xy invalid in Entity, line: 1 in Command line code on line 1
  • НЕ ДЕЛАЙТЕ того, что предложил Фрэн Верона - глобальное отключение отчетов об ошибках - это то, что вы никогда не должны делать.На производстве установите свой собственный обработчик ошибок и отобразите более красивое сообщение для пользователя, а также убедитесь, что ошибка где-то зарегистрирована, но никогда не отключайте ее полностью.Установка для error_reporting значения 0 также приведет к тому, что PHP также отключит ведение журнала ошибок.
  • Решение Xeon06 проблематично, поскольку вы выполняете весь обработчик ошибок сценария для определенного фрагмента кода.Использование собственного обработчика ошибок, который просто игнорирует ошибку, вызывает те же проблемы, что и решение Фрэн.
3 голосов
/ 16 августа 2011

Использование set_error_handler.

set_error_handler("yourHandler", E_WARNING);
2 голосов
/ 16 августа 2011

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

$dom = new DOMDocument();
$dom->strictErrorChecking = FALSE ;

$dom->load('/path/to/file.xml');
if (!$dom->validate()) {
   // Invalid XML!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...