Запутался в том, как прочитать объект xml, возвращаемый curl в php - PullRequest
3 голосов
/ 16 января 2011

Это мой 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 ]

2 голосов
/ 16 января 2011

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)
0 голосов
/ 14 марта 2011

В дополнение к другим ответам вы также можете использовать XPath для получения определенных элементов из структуры XML:

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

вернет элемент <application> с атрибутом name = 2. См. w3schools XPath tutorial для получения дополнительной информации об условиях. Просто имейте в виду, что XPath несколько медленен в PHP с SimpleXML, даже если вы не заметите этого, если у вас нет большого документа с тысячами элементов. Это хороший способ поиска не очень больших структур XMl. Если вам приходится иметь дело с большими наборами, вы можете переключиться на DOMDocument. За ним не так просто и легко следить, но с XPath он намного эффективнее.

Обновление

Я вижу, вы пытаетесь проанализировать полный ответ как XMl. Но $ resp на самом деле будет содержать полный ответ, я имею в виду заголовки. Конечно, это не будет правильно разбираться. Что вам нужно сделать, это:

//...
$resp = curl_exec($process);
$resp = substr( $resp, curl_getinfo($process, CURLINFO_HEADER_SIZE) );
curl_close($process); 
//...
0 голосов
/ 16 января 2011
$xml->application[0];

$xml->application[1];

$xml->application[2];

...
...