Я работаю с Alexa XML API, чтобы получить данные о рейтинге посещаемости веб-сайта. Я использую следующий запрос api для получения информации о веб-сайте, например facebook.com:
http://data.alexa.com/data?cli=10&dat=snbamz&url==www.facebook.com
Я получаю следующие данные в формате xml:
<!-- Need more Alexa data? Find our APIs here: https://aws.amazon.com/alexa/
-->
<ALEXA VER = "0.9" URL = "facebook.com/" HOME = "0" AID = " = " IDN = "facebook.com/">
<RLS PREFIX = "http://" more = "0">
<RL HREF = "www.zynga.com/" TITLE = "Zynga Inc."/>
<RL HREF = "www.zoominfo.com/" TITLE = "ZoomInfo"/>
<RL HREF = "www.zoho.com/" TITLE = "Zoho"/>
<RL HREF = "www.ziply.com/" TITLE = "Ziply"/>
<RL HREF = "www.zillow.com/" TITLE = "Zillow"/>
<RL HREF = "www.ziki.com/" TITLE = "Ziki.com"/>
<RL HREF = "www.zazzle.com/" TITLE = "Zazzle, Inc."/>
<RL HREF = "www.youtube.com/" TITLE = "YouTube"/>
<RL HREF = "www.yonja.com/" TITLE = "Yonja"/>
<RL HREF = "www.yelp.com/" TITLE = "Yelp"/>
</RLS>
<SD TITLE = "A" FLAGS = "" HOST = "facebook.com">
<TITLE TEXT = "Facebook"/>
<OWNER NAME = "TheFacebook, Inc."/>
</SD>
<SD>
<POPULARITY URL = "facebook.com/" TEXT = "3" SOURCE = "panel"/>
<REACH RANK = "3"/>
<RANK DELTA = "+0"/>
<COUNTRY CODE = "US" NAME = "United States" RANK = "3"/>
</SD>
</ALEXA>
Я пытаюсь проанализировать эти XML-данные с помощью функции simplexml_load_file (), но, похоже, она не работает.
Мой код:
function alexa_rank($url){
$xml = simplexml_load_file("http://data.alexa.com/data?cli=10&dat=snbamz&url = ".$url);
if (isset($xml->SD)):
return $xml->SD->POPULARITY->attributes();
endif;
}
$url = "www.facebook.com";
echo alexa_rank($url);
Я получаю следующую ошибку:
Warning: SimpleXMLElement::__toString(): Node no longer exists...
Но когда я удаляю дополнительный атрибут «&dat=snbamz» из строки запроса, он работает. Почему?
Я хочу, чтобы все значения / атрибуты узлов были выше xml. Я хочу это так же, как мы анализируем значения из объектов json после преобразования в массив php.






В XML есть 2 элемента <SD>, а <POPULARITY> определен только во втором. Если так будет всегда, то вы можете изменить свое возвращение на
return $xml->SD[1]->POPULARITY->attributes();
(Поскольку массивы начинаются с 0, [1] вернет второй элемент.)
Если вы не знаете, где и когда это может быть, вам следует использовать XPath, чтобы найти его ...
$popularity = $xml->xpath("//SD/POPULARITY")[0];
Вторая часть заключается в том, что вы возвращаете список SimpleXMLElements, поэтому может быть проще использовать json_encode() и json_decode() для преобразования данных в массив. Поэтому я предлагаю вам использовать этот код ...
function alexa_rank($url){
$xml = simplexml_load_file("http://data.alexa.com/data?cli=10&dat=snbamz&url = ".$url);
$popularity = $xml->xpath("//SD[POPULARITY]")[0];
return json_decode(json_encode($popularity),true);
}
$url = "www.facebook.com";
print_r( alexa_rank($url));
(Используйте print_r(), поскольку у вас есть массив, возвращающийся с alexa_rank())
Для данных, которые вы указали выше, это выводит ...
Array
(
[POPULARITY] => Array
(
[@attributes] => Array
(
[URL] => facebook.com/
[TEXT] => 3
[SOURCE] => panel
)
)
[REACH] => Array
(
[@attributes] => Array
(
[RANK] => 3
)
)
[RANK] => Array
(
[@attributes] => Array
(
[DELTA] => +0
)
)
[COUNTRY] => Array
(
[@attributes] => Array
(
[CODE] => US
[NAME] => United States
[RANK] => 3
)
)
)
Хорошо, я скоро попробую этот код, ну, это единственный способ разобраться. Есть ли у нас и другие варианты? Что насчет ParseXml.class.php?
Что вы на самом деле хотите от XML, проблема в том, что вы возвращаете атрибуты ПОПУЛЯРНОСТИ, хотите ли вы все значения или только одно значение?