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);
要は邪魔な文字を先にアンダーバーなどに変換してしまえばいいのです。




