首页 > 解决方案 > 如何在php中解析从alexa api返回的xml数据?

问题描述

我正在使用 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>

我试图在函数 simplexml_load_file() 的帮助下解析这个 xml 数据,但它似乎不起作用。

我的代码:

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但是当我从查询字符串中删除额外的属性“ ”时,它就可以工作了。为什么?

标签: phpxml

解决方案


<SD>XML 中有 2 个元素,<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
                )

        )

)

推荐阅读