困惑如何在php中读取curl返回的xml对象

时间:2011-01-16 15:59:21

标签: php xml curl xmlhttprequest

这是我的PHP代码:

<?php   
if (array_key_exists("site", $_GET) && $_GET["site"] != "" )
{ 
    $url = $_REQUEST['site'];
    $url = " http://api.mywot.com/0.4/public_query2?target=";   
    $result= $url.urlencode($url); 
    $process = curl_init($result); 
    //init curl connection
    curl_setopt($process, CURLOPT_HEADER, 0);    
    curl_setopt($process, CURLOPT_POST, 1); 
    curl_setopt($process, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($process,CURLOPT_CONNECTTIMEOUT,1);
    $resp = curl_exec($process); 
    curl_close($process); 
    header('Content-Type: text/xml');
    $xml = new SimpleXMLElement($resp);
}
?>

假设xml:

<?xml version="1.0" encoding="UTF-8"?>
 <query target="example.com">
   <application name="0" r="89" c="44"/>
   <application name="1" r="89" c="46"/>
   <application name="2" r="92" c="47"/>
   <application name="4" r="93" c="48"/>
 </query>

我知道如何阅读这种xml文件

<Status>
    <code>200</code>
    <request>geocode</request>
</Status>

$status = (int) $xml->Status->code;

上面的xml有重复的标签,例如application,我该如何读取某些标签?

3 个答案:

答案 0 :(得分:2)

application个项目可以作为数组访问,例如:$xml->application[3]

$x = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?>
 <query target="example.com">
   <application name="0" r="89" c="44"/>
   <application name="1" r="89" c="46"/>
   <application name="2" r="92" c="47"/>
   <application name="4" r="93" c="48"/>
 </query>');

 print_r($x); // View entire XML structure

 print_r($x->application[1]); // View the 2nd application item

 echo $x->application[1]['c']; // Get 'c' attribute from 2nd item (46)

答案 1 :(得分:0)

$xml->application[0];

$xml->application[1];

$xml->application[2];

...

答案 2 :(得分:0)

除了其他答案,您还可以使用XPath从XML结构中获取某些元素:

$xml->xpath('/query/application[@name=2]')

将返回包含属性<application>的{​​{1}}元素。有关条件的详细信息,请参阅w3schools XPath tutorial。请记住,使用SimpleXML的PHP​​中的XPath有点慢,即使你没有注意到它,除非你有一个包含数千个元素的大型文档。这是寻找不那么大的XMl结构的好方法。如果必须处理大型集,则可能需要切换到DOMDocument。它不是那么简单易用,但它在XPath方面具有更高的性能。

<强>更新

我看到你正试图解析完整的响应为XMl。但$ resp实际上会包含FULL响应,我的意思是包含标题。当然它不会正确解析。你需要做的是:

name = 2