Как анализировать XML-данные, возвращаемые из alexa api, в php?

Я работаю с 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, проблема в том, что вы возвращаете атрибуты ПОПУЛЯРНОСТИ, хотите ли вы все значения или только одно значение?

Nigel Ren 03.05.2018 15:17

Я хочу, чтобы все значения / атрибуты узлов были выше xml. Я хочу это так же, как мы анализируем значения из объектов json после преобразования в массив php.

Sachin 03.05.2018 15:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
605
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В 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?

Sachin 03.05.2018 18:30

Другие вопросы по теме