2011-01-16 5 views
3

에 컬에 의해 반환 된 XML 객체를 읽어하는 방법에 대한 혼란 :이 내 PHP 코드 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과 같은 태그를 반복합니다. 어떻게 특정 태그를 읽을 수 있습니까?

+0

사이드 노트 :'$ url'의 값을 쓰지 않습니까? '$ result = $ url.urlencode ($ _REQUEST [ 'site']); '와 같은 것이 아니어야합니다. – Gilean

+0

그래, 그게 실수 였어. – simplyblue

+0

* (sidenote) * SimpleXml과 같은 libxml 기반 확장은 사용자 정의 스트림 컨텍스트와 함께 사용할 수 있으므로 기술적으로 CURL을 사용할 필요가 없습니다. – Gordon

답변

2

application 항목 배열, 예를 들어 액세스 할 수 있습니다 :

$xml->xpath('/query/application[@name=2]') : 당신은 또한 XML 구조에서 특정 요소를 얻기 위해 XPath를 사용할 수있는 다른 답변에 추가 $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

또는 SimpleXMLElement 클래스의 attribute() 함수를 사용하여 속성을 가져올 수 있습니다. – Eray

+0

여기에 오류가 발생했습니다. $ xml = new SimpleXMLElement ($ resp); 문자열을 XML로 파싱 할 수 없습니다. 어떻게하면 $ resp를 XML로 변환해야합니까? – simplyblue

+0

'$ resp'를 출력하면 어떻게됩니까? – Gilean

0
$xml->application[0]; 

$xml->application[1]; 

$xml->application[2]; 

... 
+1

루트 요소가 별도의 객체로 액세스되지 않는다고 생각합니다. 그래서 당신은 루트 속성에 접근하기 위해 $ xml-> application [0], $ xml-> application [1] 등과 같이 루트의 자식들을 직접 검색 할 수 있습니다. 그리고 $ xml [ 'target']. – user570783

+0

@ user570783, 바로이 예제입니다. 고맙습니다. 나는 내 대답을 편집 할 것이다. 그러나 두 개 이상이 있다면 , 여전히이 요소를 객체로 사용해야합니다. – Eray

+0

... 하나 이상의 루트가있을 수 없으며, XML은 잘 형성되지 않습니다. – user570783

0

name = 2<application> 요소를 반환합니다. 조건에 대한 자세한 내용은 w3schools XPath tutorial을 참조하십시오. XPath는 PHP에서 SimpleXML로 다소 느리다는 것을 명심하십시오. 수천 개의 요소가있는 큰 문서가 없다면 XPath는주의하지 않을 것입니다. 그리 크지 않은 XMl 구조를 찾는 좋은 방법입니다. 큰 세트를 처리해야하는 경우 DOMDocument로 전환 할 수 있습니다. 따라하기 쉽지는 않지만 XPath를 사용하면 성능이 훨씬 향상됩니다.

업데이트

난 당신이 XML로 전체 응답을 구문 분석하려는 참조하십시오. 하지만 $ resp는 실제로 전체 응답을 포함 할 것입니다. 헤더를 포함한다는 의미입니다. 물론 올바르게 구문 분석하지 않습니다. 당신이해야 할 일은 다음과 같습니다 :

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