Проблемы с анализом фида Facebook с использованием PHP - PullRequest
1 голос
/ 03 августа 2011

У меня проблемы с синтаксическим анализом фида Atom в Facebook.

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

PHP DOMDocument.

Ошибки:

Предупреждение: DOMDocument:: loadXML (): xmlParseEntityRef: нет имени в объекте, строка: 12 Предупреждение: DOMDocument :: loadXML (): xmlParseEntityRef: нет имени в объекте, строка: 12 Предупреждение: DOMDocument :: loadXML (): объект «евро» не определен вОбъект, строка: 16 Предупреждение: DOMDocument :: loadXML (): объект «острый» не определен в объекте, строка: 16 Предупреждение: DOMDocument :: loadXML (): объект «евро» не определен в объекте, строка: 16 Предупреждение: DOMDocument:: loadXML (): объект «острый» не определен в объекте, строка: 16 Примечание: попытка получить свойство необъекта в ... в строке 76

К сожалению, объекты, упомянутые вышене может быть найден в коде канала.Не все так просто ... Проблема должна быть в чем-то другом.Другие каналы могут быть проанализированы с использованием того же кода без каких-либо проблем.Итак, я думаю, что проблема в HTML-коде Facebook внутри тега контента. Что бы это могло быть?Как решить?

    <content type="html">&lt;div class=&quot;ext_media clearfix has_extra has_thumb&quot;&gt;&lt;div class=&quot;title&quot;&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=BPq58p0K6DM&amp;feature=youtu.be&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot; title=&quot;http://www.youtube.com/watch?v=BPq58p0K6DM&amp;amp;feature=youtu.be&quot; onmousedown=&quot;UntrustedLink.bootstrap($(this), &quot;-AQBiGfHA&quot;, event, bagof(null));&quot;&gt;Did you know there were this many satellites in orbit VIDEO&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;url&quot;&gt;Quelle: www.youtube.com&lt;/div&gt;&lt;div class=&quot;story_posted_item clearfix&quot;&gt;&lt;div class=&quot;extra&quot;&gt;&lt;div class=&quot;share_thumb&quot;&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=BPq58p0K6DM&amp;feature=youtu.be&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot; onmousedown=&quot;UntrustedLink.bootstrap($(this), &quot;2AQBCjOTV&quot;, event, bagof(null));&quot;&gt;&lt;img class=&quot;img_loading img&quot; src=&quot;http://i3.ytimg.com/vi/BPq58p0K6DM/default.jpg&quot; alt=&quot;&quot; onload=&quot;var img = this; onloadRegister(function() { adjustImage(img); });&quot; id=&quot;share_thumb_257759307568958&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content>

См. Полный код подачи здесь .(См. Канал в браузере .)

Полный код PHP, который я использую:

<code>    $feed_xml_str = ...;

print '<pre>';
print_r( xmlstr_to_array($feed_xml_str) );
print '
';function xmlstr_to_array ($ xmlstr) {$ doc = new DOMDocument ();$ Doc-> loadXML ($ xmlstr);return domnode_to_array ($ doc-> documentElement);} function domnode_to_array ($ node) {$ output = array ();switch ($ node-> nodeType) {case XML_CDATA_SECTION_NODE: case XML_TEXT_NODE: $ output = trim ($ node-> textContent);перерыв;case XML_ELEMENT_NODE: для ($ i = 0, $ m = $ node-> childNodes-> length; $ i <$ m; $ i ++) {$ child = $ node-> childNodes-> item ($ i);$ v = domnode_to_array ($ child);if (isset ($ child-> tagName)) {$ t = $ child-> tagName;if (! isset ($ output [$ t])) {$ output [$ t] = array ();} $ output [$ t] [] = $ v;} elseif ($ v) {// >>>>> WJ: OUT COMMENTED CODE >>>>> // $ output = (string) $ v;// >>>>> WJ: ДОБАВЛЕННЫЙ КОД >>>>> if ($ node-> attribute-> length) {$ a = array ();foreach ($ node-> атрибуты как $ attrName => $ attrNode) {$ a [$ attrName] = (строка) $ attrNode-> value;} $ output ['@ attribute'] = $ a;$ output ['@ value'] = (строка) $ v;} иначе $ output = (строка) $ v;// >>>>> WJ: MODIFIED CODE END >>>>>}} if (is_array ($ output)) {if ($ node-> attribute-> length) {$ a = array ();foreach ($ node-> атрибуты как $ attrName => $ attrNode) {$ a [$ attrName] = (строка) $ attrNode-> value;} $ output ['@ attribute'] = $ a;} foreach ($ output as $ t => $ v) {if (is_array ($ v) && count ($ v) == 1 && $ t! = '@ attribute') {$ output [$ t] = $ v[0];} } } перерыв;} вернуть $ output;}

1 Ответ

4 голосов
/ 03 августа 2011

Facebook нюхает пользовательских агентов и не даст вам XML-канал, который вы видите в браузере, без него. Вы можете обработать это несколькими способами, прежде чем извлекать XML с их сервера:

ini_set("user_agent","my_awesome_magic_user_agent_which_can_be_anyhing");

Или:

stream_context_set_default(
     array(
        "http"=>array(
           "user_agent"=>"whatever"  
         )
     ));

В следующий раз, возможно, вы захотите echo свою строку XML, чтобы увидеть, что на самом деле происходит ....

...