PHP将xml输出解析为数组


PHP Parsing xml output into array

在我的项目中,我需要一个从alexa数据创建xml输出并将整个结果解析为数组的函数。我从这样的第一个节点开始:

<?php
$url="samsung.com";
$xml = simplexml_load_file('http://data.alexa.com/data?cli=10&dat=snbamz&url='.$url);
$alex2 = array();
//Related links
if($foreach = $xml->xpath('//RLS[@PREFIX="http://"]/value'))
{
 foreach($foreach as $node)
{
$alex2['HREF'] = (string) $node;
}
}
print_r($alex2);
?>

但alex2数组为空。示例中的xml输出如下:

<ALEXA VER="0.9" URL="samsung.com/" HOME="0" AID="=" IDN="samsung.com/">
<RLS PREFIX="http://" more="157">
<RL HREF="halla.com/" TITLE="Halla Engineering and Construction"/>
<RL HREF="daewoo.com/" TITLE="Daewoo"/>
<RL HREF="samsungusa.com/" TITLE="Samsungusa"/>
<RL HREF="samsungmobileusa.com/" TITLE="Welcome to Samsung Mobile USA"/>
<RL HREF="samsungmobile.com/" TITLE=":: Mobile Exciting!! - Samsung Fun Club :"/>
<RL HREF="samsung.nl/" TITLE="New URL"/>
<RL HREF="samsung.hu/" TITLE="Samsung Rt."/>
<RL HREF="samsung.fr/" TITLE="Samsung Electronics France"/>
<RL HREF="samsung.es/" TITLE="Samsung Electronica"/>
<RL HREF="samsung.de/" TITLE="Samsung Electronics GmbH"/>
<RL HREF="www.samsungtelecom.com/" TITLE="www.samsungtelecom.com/"/>
</RLS>
<SD TITLE="A" FLAGS="DMOZ" HOST="samsung.com">
<TITLE TEXT="Samsung Electronics"/>
<CREATED DATE="29-Nov-1994" DAY="29" MONTH="11" YEAR="1994"/>
<PHONE NUMBER="82 2 3415 6436, Fax: 02 3415 6652"/>
<OWNER NAME="Samsung Networks Inc."/>
<EMAIL ADDR="hostmstr@samsung.com"/>
<DOS>
<DO DOMAIN="adoptee.com" TITLE="adoptee.com"/>
<DO DOMAIN="hoammuseum.org" TITLE="hoammuseum.org"/>
<DO DOMAIN="how2lend.com" TITLE="how2lend.com"/>
<DO DOMAIN="samsung.com" TITLE="samsung.com"/>
<DO DOMAIN="samsung.net" TITLE="samsung.net"/>
<DO DOMAIN="samsungelectronics.com" TITLE="samsungelectronics.com"/>
</DOS>
[...]
</ALEXA>

有人知道吗?

提前感谢

首先,<RLS>元素有<RL>子元素,因此您必须使用嵌套循环。然后,您必须提取属性信息,因为HREF是节点的属性,而不是值。

<?php
$url="samsung.com";
$xmlDoc = simplexml_load_file('http://data.alexa.com/data?cli=10&dat=snbamz&url='.$url);
$alex2 = array();
//Related links
if($xml = $xmlDoc->xpath('//RLS[@PREFIX="http://"]')) {
  foreach($xml as $node) {
    foreach($node as $n) {
    $a = (array) $n->attributes();
    $alex2['HREF'][] =  $a['@attributes']['HREF'];
    }
  }
}