php - 如何在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
但是当我从查询字符串中删除额外的属性“ ”时,它就可以工作了。为什么?
解决方案
<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
)
)
)
推荐阅读
- java - Programmatically restart HikariPool in Spring Boot application?
- python - FFT only along 3rd dimension of 3d array?
- spring-boot - Spring Data problem - derived delete doesn't work
- reactjs - 当用户在文本字段中做某事时如何触发某些功能?
- java - 将不带空终止的字符串传递给java中的方法
- python - 我如何在 django 上动态显示画廊视图
- swift - 有没有办法使用作为参数传递的完成处理程序来检测长请求何时完成
- javascript - 为什么我不能导入 math.js 文件?
- android - 在三星设备上,AccessibilityEvent 的 AccessibilityNodeInfo 始终为空
- json - 空手道框架中基于子字符串存在的 Json 响应验证