使用PHP调用URL并获取XML响应

时间:2015-04-30 11:16:42

标签: php xml get response

所以我在调用带有params的URL(GET请求)后尝试获取XML响应。我在下面找到了这个代码,它正在运行。

$url = "http://...";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt($ch, CURLOPT_ENCODING, "gzip,deflate");     
$response = curl_exec($ch);
curl_close($ch);
echo $response;

但作为回应我得到一个没有逗号的巨大字符串(所以我不能爆炸它)。这个字符串只有值,没有键。

有没有办法获得关联数组呢?

XML就像:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>    
<transaction>    
    <date>2011-02-10T16:13:41.000-03:00</date>    
    <code>9E884542-81B3-4419-9A75-BCC6FB495EF1</code>    
    <reference>REF1234</reference>  
    <type>1</type>    
    <status>3</status>    
    <paymentMethod>    
        <type>1</type>    
        <code>101</code>    
    </paymentMethod>    
    <grossAmount>49900.00</grossAmount>    
    <discountAmount>0.00<discountAmount>
    (...)  

所以我希望有一个像:

这样的数组
date => ...
code => ...
reference => ...
(and so on)

这可能吗?如果是这样,怎么样?

编辑:我不同意“此问题已经回答”标签。在指定的主题上找不到代码解决了我的问题。但是,无论如何,我找到了一种方法,使用下面的代码。

$url = http://...;    
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$transaction= curl_exec($curl);
curl_close($curl);

$transaction = simplexml_load_string($transaction);
var_dump($transaction); //retrieve a object(SimpleXMLElement)

2 个答案:

答案 0 :(得分:0)

我使用类似的东西(非常通用的解决方案):

http://www.akchauhan.com/convert-xml-to-array-using-dom-extension-in-php5/

唯一的问题是我排除了属性部分,因为我不需要它来处理我的案例

<?php
class xml2array {

    function xml2array($xml) {
        if (is_string($xml)) {
            $this->dom = new DOMDocument;
            $this->dom->loadXml($xml);
        }

        return FALSE;
    }

    function _process($node) { 
        $occurance = array();

        foreach ($node->childNodes as $child) {
            $occurance[$child->nodeName]++;
        }

        if ($node->nodeType == XML_TEXT_NODE) { 
            $result = html_entity_decode(htmlentities($node->nodeValue, ENT_COMPAT, 'UTF-8'), 
                                 ENT_COMPAT,'ISO-8859-15');
        } else {
            if($node->hasChildNodes()){
                $children = $node->childNodes;

                for ($i=0; $i < $children->length; $i++) {
                    $child = $children->item($i);

                    if ($child->nodeName != '#text') {
                        if($occurance[$child->nodeName] > 1) {
                            $result[$child->nodeName][] = $this->_process($child);
                        } else {
                            $result[$child->nodeName] = $this->_process($child);
                        }
                    } else if ($child->nodeName == '#text') {
                        $text = $this->_process($child);

                        if (trim($text) != '') {
                            $result[$child->nodeName] = $this->_process($child);
                        }
                    }
                }
            } 
        }

        return $result;
    }

    function getResult() {
        return $this->_process($this->dom);
    }
}
?>

然后从你的脚本中调用它:

$obj = new xml2array($response);
$array = $obj->getResult();

代码非常自我解释,客观方法可以很容易地修改,以排除或包含所需的部分。

只需将XML加载到DOM对象中,然后递归检查子项并获取相应的值。

希望有所帮助

答案 1 :(得分:0)

我很幸运使用这样的代码:

$url = "http://feeds.bbci.co.uk/news/rss.xml";
$xml = file_get_contents($url);

if ($rss = new SimpleXmlElement($xml)) {
    echo $rss->channel->title;
}