проблемы с simplexml_load_file

У меня есть следующий код для чтения в файле XML:

$xml2 = simplexml_load_file('http://www.facebook.com/feeds/page.php?format=rss20&id=334704593230758'); 
$item = $xml2->channel->item;

Я получаю следующее в своем исходном коде:

<b>Warning</b>:  simplexml_load_file() [<a href='function.simplexml-load-file'>function.simplexml-load-file</a>]: http://www.facebook.com/feeds/page.php?format=rss20&amp;id=334704593230758:11: parser error : xmlParseEntityRef: no name in <b>/home/content/49/8644249/html/test/_inc/footer.php</b> on line <b>110</b><br />


так продолжается еще 10 строк. Есть ли проблема с кодом xml?


person jppower175    schedule 23.07.2012    source источник
comment
Быстрый Google (что вы могли бы сделать) показывает, что это означает, что в файле есть незакодированный амперсанд (все случайные & должны быть &amp;). Похоже, facebook не выводит должным образом html_entities() RSS-каналы.   -  person Bailey Parker    schedule 24.07.2012
comment
Оооо, кто-нибудь в FB получит за это задницу... Хотя я просматриваю XML, возвращаемый в настоящее время этим URL, и с ним нет такой проблемы - и в нем есть несколько правильно закодированных сущностей.   -  person DaveRandom    schedule 24.07.2012


Ответы (1)


Хорошо, немного странно, так как это RSS-канал и не предназначен для непосредственного чтения человеком, ответ на это заключается в том, что вы должны включить заголовок User-Agent: в свой запрос.

Когда я загружаю URL-адрес в Chrome, чтобы получить действительный XML-документ, когда я запускаю ваш код, я получаю те же ошибки, что и вы. При ближайшем рассмотрении я обнаружил, что когда я запускаю ваш код, я фактически получаю минимальный HTML-документ, а не желаемый XML - для того, чтобы получить правильный результат, вы должны передать действительную строку пользовательского агента, что означает, что вы не можете использовать simplexml_load_file() потому что он не поддерживает контексты потока.

Этот код работает для меня:

// User-Agent string from Chrome. I haven't tested anything else so I don't know
// what is actually required, but this works.
$context = stream_context_create(array(
  'http'=>array(
    'user_agent' => 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11'
   )
));

// Get data as a string
$xml2 = file_get_contents('http://www.facebook.com/feeds/page.php?format=rss20&id=334704593230758', FALSE, $context);

// Convert string to a SimpleXML object
$xml2 = simplexml_load_string($xml2);

$item = $xml2->channel->item;
person DaveRandom    schedule 23.07.2012