@ree4i

Как проверить simplexml_load_file на удачную загрузку?

Скриптом стандартно подгружаю xml с не самого стабильного сервака.
$linkxml="http://ссылка.ру";
$xml = simplexml_load_file($linkxml);

часто скрипт выдаёт набор стандартных ошибок, типа:
Warning: simplexml_load_file() [function.simplexml-load-file]: http://ссылка.ру:6: parser error : Opening and ending tag mismatch: hr line 5 and body in /home/public_html/ссылка/update.php on line 106

Проверка ответа сервера не поможет, т.к. сервак ответит "200", а файл всё-равно не загрузится до конца.
Как правильно осуществить проверку типа:
$linkxml="http://ссылка.ру";
$xml = simplexml_load_file($linkxml);
if (!simplexml_load_file($linkxml)) {echo 'файл не получен';} else {$xml = "не могу придумать как получить сюда данные из simplexml_load_file";}

И сразу вопрос в догонку - как при неудачной загрузки перезапустить скрипт, вернее как это сделать правильнее, чем тупым копированием всего кода парсинка из else в if?
  • Вопрос задан
  • 1496 просмотров
Решения вопроса 1
difiso
@difiso
В параллельной вселенной я космонавт
В документации сказано
Возвращает объект (object) класса SimpleXMLElement со свойствами, содержащими данные, которые хранятся внутри XML-документа или FALSE в случае возникновения ошибки.


А тот warning, что возникает это из-за неверного XML, о чем в ЛОГАХ и пишется. В коде проверяйте следующим образом: if ($xml !== false) {...}

Если у вас возвращается неверный XML, то со временем это никак не поменяется (скорее всего), поэтому перезапуск и дальнейшие попытки загрузить ни к чему не приведут. А если уж хочется пытаться загрузить снова, то попробуйте
do {
$xml = simplexml_load_file(...);
} while ($xml === false);
// $xml загружен.

Только в таком виде будьте осторожны - очень легко получить бесконечный цикл.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Ведисофт Екатеринбург
от 25 000 ₽
YCLIENTS Москва
от 200 000 до 350 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽