2011-01-16 6 views
3

Das ist mein PHP-Code zurückgegeben XML-Objekt zu lesen:Verwirrt, wie durch Curl in 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); 
} 
?> 

Angenommene 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> 

Ich weiß, wie zu lesen, diese Art von XML-Datei

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

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

Das obige xml hat Tags wie application wiederholt, wie kann ich bestimmte lesen?

+0

Seitennotiz: Schreiben Sie nicht über den Wert von '$ url'? Sollte es nicht etwas wie '$ result = $ url.urlencode ($ _ REQUEST ['site']) sein;'? – Gilean

+0

Ja Entschuldigung, das war ein Fehler – simplyblue

+0

* (sidenote) * libxml-basierte Erweiterungen wie SimpleXml können mit benutzerdefinierten Stream-Kontexten verwendet werden, so dass es technisch keine Notwendigkeit gibt, CURL – Gordon

Antwort

2

application Einzelteile werden als ein Array, beispielsweise zugänglich sein: $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

Oder Sie können die attribute() - Funktion der SimpleXMLElement-Klasse zum Abrufen von Attributen verwenden. – Eray

+0

Hier bekomme ich einen Fehler $ xml = new SimpleXMLElement ($ resp); String konnte nicht als XML geparst werden. Wie sollte ich $ resp in ein Xml umwandeln? – simplyblue

+0

Wenn Sie '$ resp 'ausdrucken, was zeigt es? – Gilean

0
$xml->application[0]; 

$xml->application[1]; 

$xml->application[2]; 

... 
+1

zu verwenden Ich denke, das Root-Element wird nicht als separates Objekt zugegriffen, So können Sie direkt die untergeordneten Elemente des Stammverzeichnisses abrufen, z. B. $ xml-> application [0], $ xml-> application [1] usw. Und $ xml ['target'], um auf die Root-Attribute zuzugreifen. – user570783

+0

@ user570783, Sie sind richtig für dieses Beispiel. Vielen Dank. Ich werde meine Antwort bearbeiten. Aber wenn es zwei oder mehr gibt, muss er immer noch dieses Element als ein Objekt verwenden :) – Eray

+0

Aber ... es kann nicht mehr als eine Wurzel geben, das wäre keine wohlgeformte XML. – user570783

0

Neben anderen Antworten, die Sie auch XPath verwenden können bestimmte Elemente aus einer XML-Struktur zu erhalten:

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

wird das Element <application> mit dem Attribut name = 2 zurückgeben. Weitere Informationen zu den Bedingungen finden Sie unter w3schools XPath tutorial. Bedenken Sie jedoch, dass XPath in PHP mit SimpleXML etwas langsam ist, auch wenn Sie es nicht bemerken, es sei denn, Sie haben ein großes Dokument mit Tausenden von Elementen. Es ist eine gute Möglichkeit, nicht so große XMl-Strukturen zu suchen. Wenn Sie mit großen Sets arbeiten müssen, sollten Sie zu DOMDocument wechseln. Es ist nicht so einfach und einfach zu folgen, aber es hat eine viel größere Leistung mit XPath.

aktualisieren

Ich sehe Sie versuchen, vollständige Antwort als XML zu analysieren. Aber $ resp wird tatsächlich FULL Response enthalten, einschließlich Header. Natürlich wird es nicht korrekt parsen. Was Sie tun müssen, ist:

//... 
$resp = curl_exec($process); 
$resp = substr($resp, curl_getinfo($process, CURLINFO_HEADER_SIZE)); 
curl_close($process); 
//...