XMLファイルをPHPで扱いやすい変数にする
XMLファイルをPHPで開いたけど、どうやって配列に格納すればいい?
XML形式のファイルからデータを取り出してPHPで扱いたいときに、file_get_contentsしてもその後どうすれば・・・といったケースです。
PHPには simplexml_load_string という便利な関数が有ります。この関数はXMLファイルをオブジェクトとして返してくれるので、それを変数に格納していきます。
1 2 | $string = file_get_contents ( 'xml.xml' ); //ファイルを得る $obj = simplexml_load_string( $string ); //オブジェクトに変換 |
実行結果
1 2 3 4 5 6 | object(SimpleXMLElement)#1 (8) { [ "userFname" ]=> string(6) "太朗" [ "userLname" ]=> string(6) "山田" ....... |
このままでも良いのですが、扱い易い変数にするため、以下のようなユーザー定義関数を通します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | function xml_row( $obj ) { $arr = array (); if ( is_object ( $obj )) { $obj = get_object_vars( $obj ); } else { $obj = $obj ; } foreach ( $obj as $key => $val ) { if ( is_object ( $obj [ $key ])) { $arr [ $key ] = xml_row( $val ); } else if ( is_array ( $val )) { foreach ( $val as $k => $v ) { if ( is_object ( $v ) || is_array ( $v )) { $arr [ $key ][ $k ] = xml_row( $v ); } else { $arr [ $key ][ $k ] = $v ; } } } else { $arr [ $key ] = $val ; } } return $arr ; } |
全体のソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | function xml_row( $obj ) { $arr = array (); if ( is_object ( $obj )) { $obj = get_object_vars( $obj ); } else { $obj = $obj ; } foreach ( $obj as $key => $val ) { if ( is_object ( $obj [ $key ])) { $arr [ $key ] = xml_row( $val ); } else if ( is_array ( $val )) { foreach ( $val as $k => $v ) { if ( is_object ( $v ) || is_array ( $v )) { $arr [ $key ][ $k ] = xml_row( $v ); } else { $arr [ $key ][ $k ] = $v ; } } } else { $arr [ $key ] = $val ; } } return $arr ; } $string = file_get_contents ( 'xml.xml' ); //ファイルを得る $obj = simplexml_load_string( $string ); //オブジェクトに変換 $obj = xml_row( $obj ); //配列にする var_dump( $obj ); ?> |
実行結果はサンプルを参照して下さい。 このように配列で戻ってくるので、後はご自由に。
名前空間が定義されている場合
1 2 3 | $string = preg_replace( '/:/' , '_' , file_get_contents ( 'xml2.xml' )); $obj = simplexml_load_string( $string ); $obj = xml_row( $obj ); |
要は邪魔な文字を先にアンダーバーなどに変換してしまえばいいのです。