您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“在PHP中使用SPL庫中的對象方法進(jìn)行XML與數(shù)組轉(zhuǎn)換的方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“在PHP中使用SPL庫中的對象方法進(jìn)行XML與數(shù)組轉(zhuǎn)換的方法”吧!
本篇文章給大家介紹一下在PHP中使用SPL庫中的對象方法進(jìn)行XML與數(shù)組的轉(zhuǎn)換的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。
雖說現(xiàn)在很多的服務(wù)提供商都會提供 JSON 接口供我們使用,但是,還是有不少的服務(wù)依然必須使用 XML 作為接口格式,這就需要我們來對 XML 格式的數(shù)據(jù)進(jìn)行解析轉(zhuǎn)換。而 PHP 中并沒有像 json_encode() 、 json_decode() 這樣的函數(shù)能夠讓我們方便地進(jìn)行轉(zhuǎn)換,所以在操作 XML 數(shù)據(jù)時,大家往往都需要自己寫代碼來實現(xiàn)。
今天,我們介紹的是使用 SPL 擴(kuò)展庫中的一些對象方法來處理 XML 數(shù)據(jù)格式的轉(zhuǎn)換。首先,我們定義一個類,就相當(dāng)于封裝一個操作 XML 數(shù)據(jù)轉(zhuǎn)換的類,方便我們將來使用。如果只是測試效果的話,直接寫下面的函數(shù)也是可以的。
class ConvertXml{ // .... }
class ConvertXml{ public function xmlToArray(SimpleXMLIterator $xml): array { $res = []; for ($xml->rewind(); $xml->valid(); $xml->next()) { $a = []; if (!array_key_exists($xml->key(), $a)) { $a[$xml->key()] = []; } if ($xml->hasChildren()) { $a[$xml->key()][] = $this->xmlToArray($xml->current()); } else { $a[$xml->key()] = (array) $xml->current()->attributes(); $a[$xml->key()]['value'] = strval($xml->current()); } $res[] = $a; } return $res; } // ..... } $wsdl = 'http://flash.weather.com.cn/wmaps/xml/china.xml'; $xml = new SimpleXMLIterator($wsdl, 0, true); $convert = new ConvertXml(); // var_dump($convert->xmlToArray($xml)); // array(37) { // [0]=> // array(1) { // ["city"]=> // array(2) { // ["@attributes"]=> // array(9) { // ["quName"]=> // string(9) "黑龍江" // ["pyName"]=> // string(12) "heilongjiang" // ["cityname"]=> // string(9) "哈爾濱" // ["state1"]=> // string(1) "7" // ["state2"]=> // string(1) "3" // ["stateDetailed"]=> // string(15) "小雨轉(zhuǎn)陣雨" // ["tem1"]=> // string(2) "21" // ["tem2"]=> // string(2) "16" // ["windState"]=> // string(21) "南風(fēng)6-7級轉(zhuǎn)4-5級" // } // ["value"]=> // string(0) "" // } // } // [1]=> // array(1) { // ["city"]=> // array(2) {
在這里,我們使用的是 SimpleXMLIterator 對象。從名稱中就可以看出,它的作用是生成可以遍歷的 SimpleXMLElement 對象。第一個參數(shù)是格式正確的 XML 文本或者鏈接地址。第二個參數(shù)是一些選項參數(shù),這里我們直接給 0 就可以了。第三個參數(shù)則是指明第一個參數(shù)是否是鏈接地址,這里我們給 true 。
我們在客戶端生成了 SimpleXMLIterator 對象,并傳遞到 xmlToArray() 方法中。這樣 SimpleXMLIterator 對象就能讓我們遍歷各個結(jié)點了,接下來的事情就很簡單了,我們只需要判斷一下結(jié)點是否還有子結(jié)點,如果有子結(jié)點則遞歸調(diào)用當(dāng)前這個方法。如果沒有子結(jié)點了,就獲取結(jié)點的屬性和內(nèi)容。
這個測試鏈接是獲取天氣信息的,返回的內(nèi)容中每個結(jié)點都只有屬性沒有內(nèi)容,體現(xiàn)在轉(zhuǎn)換后的數(shù)組中就是 value 字段都是空的。
class ConvertXml{ // ...... const UNKNOWN_KEY = 'unknow'; public function arrayToXml(array $a) { $xml = new SimpleXMLElement('<?xml version="1.0" standalone="yes"?><root></root>'); $this->phpToXml($a, $xml); return $xml->asXML(); } protected function phpToXml($value, &$xml) { $node = $value; if (is_object($node)) { $node = get_object_vars($node); } if (is_array($node)) { foreach ($node as $k => $v) { if (is_numeric($k)) { $k = 'number' . $k; } if (!is_array($v) && !is_object($v)) { $xml->addChild($k, $v); } else { $newNode = $xml->addChild($k); $this->phpToXml($v, $newNode); } } } else { $xml->addChild(self::UNKNOWN_KEY, $node); } } } var_dump($convert->arrayToXml($data)); // string(84454) "<?xml version="1.0" standalone="yes"?> // <root><unlikely-outliner><subject><mongo-db><outline><chapter><getting-started><number0> ........... // "
我們在 arrayToXml() 中,先使用 SimpleXMLElement 對象創(chuàng)建了一個基本的根結(jié)點結(jié)構(gòu)。然后使用 phpToXml() 方法來創(chuàng)建所有結(jié)點。為什么要拆成兩個方法呢?因為 phpToXml() 方法是需要遞歸調(diào)用的,在每次遞歸的時候我們不需要重新的去創(chuàng)建根結(jié)點,只需要在根結(jié)點下面使用 addChild() 添加子結(jié)點就可以了。
在 phpToXml() 的代碼中,我們還使用了 get_object_vars() 函數(shù)。就是當(dāng)傳遞進(jìn)來的數(shù)組項內(nèi)容是對象時,通過這個函數(shù)可以獲取對象的所有屬性。如果將對象看做是一個數(shù)組的話,每個屬性值就是它的鍵值對。
在對每個鍵值遍歷時,我們判斷當(dāng)前的鍵對應(yīng)的內(nèi)容是否是數(shù)組或者是對象。如果不是這兩種形式的內(nèi)容的話,就直接將當(dāng)前的內(nèi)容添加為當(dāng)前結(jié)點的子結(jié)點。如果是數(shù)組或?qū)ο蟮脑挘屠^續(xù)遞歸地添加直到數(shù)組內(nèi)容全部遍歷完成。
測試的 $data 內(nèi)容非常長,大家可以直接通過測試代碼的鏈接去 Github 上查閱。
這篇文章的內(nèi)容是簡單的學(xué)習(xí)了一個 SPL 擴(kuò)展庫中對于 XML 操作的兩個對象的使用。通過它們,我們可以方便的轉(zhuǎn)換 XML 數(shù)據(jù)格式。當(dāng)然,對于 XML 的格式轉(zhuǎn)換來說,我們還有其它的方法,以后學(xué)到了再說!
測試代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/在PHP中使用SPL庫中的對象方法進(jìn)行XML與數(shù)組的轉(zhuǎn)換.php
到此,相信大家對“在PHP中使用SPL庫中的對象方法進(jìn)行XML與數(shù)組轉(zhuǎn)換的方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。