PHP simplexml_load_file - ловить ошибки файла - PullRequest
4 голосов
/ 17 декабря 2009

Возможно ли отлавливать ошибки файла simplexml? Я подключаюсь к веб-службе, которая иногда дает сбой, и мне нужно заставить систему пропустить файл, если он возвращает какую-то ошибку http или что-то подобное.

Ответы [ 7 ]

9 голосов
/ 17 апреля 2013

Использование @ просто грязно.

Если вы посмотрите руководство, есть параметр options:

SimpleXMLElement simplexml_load_file ( string $filename [, string $class_name = "SimpleXMLElement" [, int $options = 0 [, string $ns = "" [, bool $is_prefix = false ]]]] )

Весь список опций доступен здесь: http://www.php.net/manual/en/libxml.constants.php

Это правильный способ подавления предупреждений:

$xml = simplexml_load_file('file.xml', 'SimpleXMLElement', LIBXML_NOWARNING);
6 голосов
/ 17 декабря 2009

Если вас не интересуют сообщения об ошибках или ведение журнала при сбое веб-службы, вы можете использовать оператор подавления ошибок:

$xml= @simplexml_load_file('http://tri.ad/test.xml');
if ($xml) {
 // Do some stuff . . .
}

Но это простой взлом. Более надежным решением было бы загрузить файл XML с помощью cURL , регистрировать любые неудачные запросы, анализировать любой документ XML, возвращенный с помощью simplexml_load_string, регистрировать любые ошибки синтаксического анализа XML, а затем выполнять некоторые действия с допустимым XML.

6 голосов
/ 17 декабря 2009

Вы говорите о двух разных вещах. Ошибки HTTP не будут иметь ничего общего с допустимостью файла XML, поэтому вы смотрите на две отдельные области обработки ошибок.

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

Что касается ошибок HTTP, их обработка будет зависеть от того, как вы подключаетесь к веб-службе и извлекаете данные.

5 голосов
/ 17 декабря 2009

При ошибке ваш файл simplexml_load_file должен вернуть false

Итак, сделаем что-нибудь простое:

   $xml = @simplexml_load_file('myfile');
   if (!$xml) {
      echo "Uh oh's, we have an error!";
   }

Это один из способов обнаружения ошибок.

2 голосов
/ 17 декабря 2009

Вы можете настроить обработчик ошибок в PHP, чтобы генерировать исключение при любых ошибках PHP: (Пример и дополнительная документация находятся здесь: PHP.net )

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
1 голос
/ 14 сентября 2017

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

Вот пример:

<?php
    //Store errors in memory rather than outputting them
    libxml_use_internal_errors(true);

    $xml = simplexml_load_file('myfile.xml');

    if (!$xml){
        //Exit because we can't process a broken file
        exit;
    }

    //Important to clear the error buffer
    libxml_clear_errors();

    //Display your xml code
    print_r($xml);

Другой пример, фактически использующий зафиксированные нами ошибки:

<?php
    //Store errors in memory rather than outputting them
    libxml_use_internal_errors(true);

    $xml = simplexml_load_file('myfile.xml');

    if (!$xml){

        echo "Your script is not valid due to the following errors:\n";

        //Process error messages
        foreach(libxml_get_errors() as $error){
           echo "$error";
        }

        //Exit because we can't process a broken file
        exit;
    }

    //Important to clear the error buffer
    libxml_clear_errors();

    //Display your xml code
    print_r($xml);
0 голосов
/ 29 июля 2014
if (!$xml=simplexml_load_file('./samplexml.xml')) {  
    trigger_error('Error reading XML file',E_USER_ERROR);
}

foreach ($xml as $syn) {
    $candelete = $syn->candelete;
    $forpayroll = $syn->forpayroll;
    $name = $syn->name;
    $sql = "INSERT INTO vtiger (candelete, forpayroll, name) VALUES('$candelete','$forpayroll','$name')";
    $query = mysql_query($sql);
}
...