この記事では、SPL ライブラリのオブジェクト メソッドを使用して、PHP で XML と配列を変換する方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
現在、多くのサービス プロバイダーが私たちが使用できる JSON インターフェイスを提供していますが、インターフェイス形式として XML を使用する必要があるサービスは依然として多くあり、そのためには解析と変換が必要になります。 XML 形式のデータ。 PHP には json_encode() や json_decode() のような簡単に変換できる関数がないため、XML データを操作する場合、多くの場合、それを実現するために誰もが独自のコードを記述する必要があります。
今日は、SPL 拡張ライブラリのいくつかのオブジェクト メソッドを使用して XML データ形式の変換を処理する方法を紹介します。まず、クラスを定義します。これは、将来の使用のために XML データ変換を操作するクラスをカプセル化するのと同じです。効果をテストしたいだけの場合は、次の関数を直接記述することもできます。
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) "小雨转阵雨" // ["tem1"]=> // string(2) "21" // ["tem2"]=> // string(2) "16" // ["windState"]=> // string(21) "南风6-7级转4-5级" // } // ["value"]=> // string(0) "" // } // } // [1]=> // array(1) { // ["city"]=> // array(2) {
ここでは、SimpleXMLIterator オブジェクトを使用しています。名前からわかるように、その役割は、走査可能な SimpleXMLElement オブジェクトを生成することです。最初のパラメータは、適切にフォーマットされた XML テキストまたはリンク アドレスです。 2 番目のパラメータはいくつかのオプションパラメータですが、ここでは直接 0 を与えるだけで済みます。 3 番目のパラメータは、最初のパラメータがリンク アドレスであるかどうかを示します。ここでは true を指定します。
クライアント側で SimpleXMLIterator オブジェクトを生成し、それを xmlToArray() メソッドに渡しました。このように、SimpleXMLIterator オブジェクトを使用すると、各ノードをトラバースできます。次の作業は非常に簡単です。ノードに子ノードがあるかどうかを確認するだけです。子ノードがある場合は、現在のメソッドを再帰的に呼び出します。子ノードがない場合は、ノードの属性とコンテンツを取得します。
このテスト リンクは、気象情報を取得するためのものです。返されたコンテンツの各ノードには属性のみがあり、コンテンツはありません。これは、値フィールドが空の変換された配列に反映されます。
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 オブジェクトを使用して基本的なルート ノード構造を作成します。次に、phpToXml() メソッドを使用してすべてのノードを作成します。なぜ 2 つの方法に分割するのでしょうか? phpToXml() メソッドは再帰的に呼び出す必要があるため、再帰のたびにルート ノードを再作成する必要はなく、ルート ノードの下で addChild() を使用して子ノードを追加するだけで済みます。
phpToXml() のコードでは、get_object_vars() 関数も使用します。つまり、渡された配列項目の内容がオブジェクトの場合、この関数を通じてオブジェクトのすべてのプロパティを取得できます。オブジェクトを配列と考えると、各属性値はそのキーと値のペアになります。
各キー値を走査するとき、現在のキーに対応するコンテンツが配列であるかオブジェクトであるかを判断します。コンテンツがこれら 2 つの形式ではない場合、現在のコンテンツは現在のノードの子ノードとして直接追加されます。配列またはオブジェクトの場合は、配列の内容がすべて調べられるまで再帰的に追加を続けます。
テストの $data コンテンツは非常に長いため、テスト コードへのリンクを通じて Github で直接確認できます。
この記事の内容は、XML 操作のための SPL 拡張ライブラリ内の 2 つのオブジェクトの使用法を学ぶことです。これらを介して、XML データ形式を簡単に変換できます。もちろん、XML フォーマット変換には他の方法もあります。これについては後ほど説明します。
テスト コード:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/在PHP中使用SPL库中的对象方法进行XML与数组的转换.php
推奨学習: php ビデオ チュートリアル
以上がSPL ライブラリのオブジェクト メソッドを使用して XML を PHP の配列に変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。