這篇文章主要介紹“PHP如何使用SPL庫(kù)中的對(duì)象方法進(jìn)行XML與數(shù)組的轉(zhuǎn)換”,在日常操作中,相信很多人在PHP如何使用SPL庫(kù)中的對(duì)象方法進(jìn)行XML與數(shù)組的轉(zhuǎn)換問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”P(pán)HP如何使用SPL庫(kù)中的對(duì)象方法進(jìn)行XML與數(shù)組的轉(zhuǎn)換”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、石城網(wǎng)絡(luò)推廣、微信平臺(tái)小程序開(kāi)發(fā)、石城網(wǎng)絡(luò)營(yíng)銷、石城企業(yè)策劃、石城品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供石城建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com
雖說(shuō)現(xiàn)在很多的服務(wù)提供商都會(huì)提供 JSON 接口供我們使用,但是,還是有不少的服務(wù)依然必須使用 XML 作為接口格式,這就需要我們來(lái)對(duì) XML 格式的數(shù)據(jù)進(jìn)行解析轉(zhuǎn)換。而 PHP 中并沒(méi)有像 json_encode() 、 json_decode() 這樣的函數(shù)能夠讓我們方便地進(jìn)行轉(zhuǎn)換,所以在操作 XML 數(shù)據(jù)時(shí),大家往往都需要自己寫(xiě)代碼來(lái)實(shí)現(xiàn)。
今天,我們介紹的是使用 SPL 擴(kuò)展庫(kù)中的一些對(duì)象方法來(lái)處理 XML 數(shù)據(jù)格式的轉(zhuǎn)換。首先,我們定義一個(gè)類,就相當(dāng)于封裝一個(gè)操作 XML 數(shù)據(jù)轉(zhuǎn)換的類,方便我們將來(lái)使用。如果只是測(cè)試效果的話,直接寫(xiě)下面的函數(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級(jí)轉(zhuǎn)4-5級(jí)" // } // ["value"]=> // string(0) "" // } // } // [1]=> // array(1) { // ["city"]=> // array(2) {
在這里,我們使用的是 SimpleXMLIterator 對(duì)象。從名稱中就可以看出,它的作用是生成可以遍歷的 SimpleXMLElement 對(duì)象。第一個(gè)參數(shù)是格式正確的 XML 文本或者鏈接地址。第二個(gè)參數(shù)是一些選項(xiàng)參數(shù),這里我們直接給 0 就可以了。第三個(gè)參數(shù)則是指明第一個(gè)參數(shù)是否是鏈接地址,這里我們給 true 。
我們?cè)诳蛻舳松闪?SimpleXMLIterator 對(duì)象,并傳遞到 xmlToArray() 方法中。這樣 SimpleXMLIterator 對(duì)象就能讓我們遍歷各個(gè)結(jié)點(diǎn)了,接下來(lái)的事情就很簡(jiǎn)單了,我們只需要判斷一下結(jié)點(diǎn)是否還有子結(jié)點(diǎn),如果有子結(jié)點(diǎn)則遞歸調(diào)用當(dāng)前這個(gè)方法。如果沒(méi)有子結(jié)點(diǎn)了,就獲取結(jié)點(diǎn)的屬性和內(nèi)容。
這個(gè)測(cè)試鏈接是獲取天氣信息的,返回的內(nèi)容中每個(gè)結(jié)點(diǎn)都只有屬性沒(méi)有內(nèi)容,體現(xiàn)在轉(zhuǎn)換后的數(shù)組中就是 value 字段都是空的。
class ConvertXml{ // ...... const UNKNOWN_KEY = 'unknow'; public function arrayToXml(array $a) { $xml = new SimpleXMLElement(''); $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) " // ........... // "
我們?cè)?arrayToXml() 中,先使用 SimpleXMLElement 對(duì)象創(chuàng)建了一個(gè)基本的根結(jié)點(diǎn)結(jié)構(gòu)。然后使用 phpToXml() 方法來(lái)創(chuàng)建所有結(jié)點(diǎn)。為什么要拆成兩個(gè)方法呢?因?yàn)?phpToXml() 方法是需要遞歸調(diào)用的,在每次遞歸的時(shí)候我們不需要重新的去創(chuàng)建根結(jié)點(diǎn),只需要在根結(jié)點(diǎn)下面使用 addChild() 添加子結(jié)點(diǎn)就可以了。
在 phpToXml() 的代碼中,我們還使用了 get_object_vars() 函數(shù)。就是當(dāng)傳遞進(jìn)來(lái)的數(shù)組項(xiàng)內(nèi)容是對(duì)象時(shí),通過(guò)這個(gè)函數(shù)可以獲取對(duì)象的所有屬性。如果將對(duì)象看做是一個(gè)數(shù)組的話,每個(gè)屬性值就是它的鍵值對(duì)。
在對(duì)每個(gè)鍵值遍歷時(shí),我們判斷當(dāng)前的鍵對(duì)應(yīng)的內(nèi)容是否是數(shù)組或者是對(duì)象。如果不是這兩種形式的內(nèi)容的話,就直接將當(dāng)前的內(nèi)容添加為當(dāng)前結(jié)點(diǎn)的子結(jié)點(diǎn)。如果是數(shù)組或?qū)ο蟮脑?,就繼續(xù)遞歸地添加直到數(shù)組內(nèi)容全部遍歷完成。
測(cè)試的 $data 內(nèi)容非常長(zhǎng),大家可以直接通過(guò)測(cè)試代碼的鏈接去 Github 上查閱。
這篇文章的內(nèi)容是簡(jiǎn)單的學(xué)習(xí)了一個(gè) SPL 擴(kuò)展庫(kù)中對(duì)于 XML 操作的兩個(gè)對(duì)象的使用。通過(guò)它們,我們可以方便的轉(zhuǎn)換 XML 數(shù)據(jù)格式。當(dāng)然,對(duì)于 XML 的格式轉(zhuǎn)換來(lái)說(shuō),我們還有其它的方法,以后學(xué)到了再說(shuō)!
到此,關(guān)于“PHP如何使用SPL庫(kù)中的對(duì)象方法進(jìn)行XML與數(shù)組的轉(zhuǎn)換”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!