XMLファイルをPHPで扱いやすい変数にする
XMLファイルをPHPで開いたけど、どうやって配列に格納すればいい?
XML形式のファイルからデータを取り出してPHPで扱いたいときに、file_get_contentsしてもその後どうすれば・・・といったケースです。
PHPには simplexml_load_string という便利な関数が有ります。この関数はXMLファイルをオブジェクトとして返してくれるので、それを変数に格納していきます。
$string = file_get_contents('xml.xml'); //ファイルを得る $obj = simplexml_load_string($string); //オブジェクトに変換
実行結果
object(SimpleXMLElement)#1 (8) { ["userFname"]=> string(6) "太朗" ["userLname"]=> string(6) "山田" .......
このままでも良いのですが、扱い易い変数にするため、以下のようなユーザー定義関数を通します。
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; }
全体のソースコード
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); ?>
実行結果はサンプルを参照して下さい。 このように配列で戻ってくるので、後はご自由に。
名前空間が定義されている場合
$string = preg_replace('/:/','_',file_get_contents('xml2.xml')); $obj = simplexml_load_string($string); $obj = xml_row($obj);
要は邪魔な文字を先にアンダーバーなどに変換してしまえばいいのです。