2013-02-27 2 views
3

Я использую функцию simplexml_load_file() PHP для вызова API, который возвращает измененные результаты на основе отправленной мной отметки времени.Как проверить, что файл XML хорош, прежде чем запускать simplexml_load_file()

Таким образом, API вернет только результаты, которые изменились с момента моей отметки. Проблема, с которой я столкнулась, заключается в том, что временная метка слишком скоро, и нет никаких результатов для возврата API, тогда она не вернет правильный XML-файл, а просто вернет пустую страницу.

Это вызывает все виды проблем с simplexml_load_file

Вот простой тест, который я могу запустить ...

$xml = 'http://api.rescuegroups.org/rest/?key=CZivWWGD&type=orgs&limit=300&updatedAfter=1361941202&startPage=1'; 

$xmlObj = new SimpleXMLElement($xml, NULL, TRUE); 

Это приводит к ...

Warning: SimpleXMLElement::__construct(): http://api.rescuegroups.org/rest/?key=CZivWWGD&type=orgs&limit=300&updatedAfter=1361941202&startPage=1:1: parser error : Document is empty in E:\Server\htdocs\labs\freelance\dogAPI\testorg.php on line 9 

Warning: SimpleXMLElement::__construct(): in E:\Server\htdocs\labs\freelance\dogAPI\testorg.php on line 9 

Warning: SimpleXMLElement::__construct():^in E:\Server\htdocs\labs\freelance\dogAPI\testorg.php on line 9 

Warning: SimpleXMLElement::__construct(): http://api.rescuegroups.org/rest/?key=CZivWWGD&type=orgs&limit=300&updatedAfter=1361941202&startPage=1:1: parser error : Start tag expected, '<' not found in E:\Server\htdocs\labs\freelance\dogAPI\testorg.php on line 9 

Warning: SimpleXMLElement::__construct(): in E:\Server\htdocs\labs\freelance\dogAPI\testorg.php on line 9 

Warning: SimpleXMLElement::__construct():^in E:\Server\htdocs\labs\freelance\dogAPI\testorg.php on line 9 

Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in E:\Server\htdocs\labs\freelance\dogAPI\testorg.php:9 Stack trace: #0 E:\Server\htdocs\labs\freelance\dogAPI\testorg.php(9): SimpleXMLElement->__construct('http://api.resc...', 0, true) #1 {main} thrown in E:\Server\htdocs\labs\freelance\dogAPI\testorg.php on line 9 

Теперь, если Я передаю API временную метку, которая далее возвращается туда, где есть результаты, после чего она вернет идеальный XML-документ.

Я ищу способ предотвратить предотвращение этой неприятной ошибки как-то?

+0

Используйте 'file_get_contents()' для извлечения данных, а затем проверить его, и использовать 'simplexml_load_string()', чтобы загрузить его? –

+2

Чтобы вылечить причину, а не симптомы, сделайте все одолжение и свяжитесь со службой rescuegroups.org и сообщите им, что их API не отправляет ответ XML, когда это необходимо, например. он должен возвращать '' – Gordon

ответ

0
$xml = @simplexml_load_file('http://api.rescuegroups.org/rest/?key=CZivWWGD&type=orgs&limit=300&updatedAfter=1361941202&startPage=1'); 
if(false !== $xml) 
{ 
    // Do anything with xml 
} 

Если там ошибки @ скрыть его и возвращают ложные

+0

, это подавляет * любые * ошибки, а не только те, которые связаны с разбором XML. Кроме того, он не будет работать, если включен ext/scream (маловероятно, но все же). Лучший вариант - использовать 'libxml_use_internal_errors'. – Gordon

4

simplexml_load_file:

Используйте libxml_use_internal_errors(), чтобы подавить все ошибки XML и libxml_get_errors() перебрать их впоследствии.

Возвращает объект класса SimpleXMLElement со свойствами, содержащими данные, хранящиеся в документе XML, или FALSE при сбое.

Так что подавляйте ошибки и проверяйте FALSE, чтобы обнаружить, когда запрос не прошел должным образом.

Смежные вопросы