PHPでXMLを配列に変換する方法「simpleXML」

PHPでXMLを扱いたかったら、XMLを読み込んで配列に落とし込みたいですよね。でも、それを自分で記述するのはちょっと…って思ってたら、当たり前のようにXMLを配列に変換してくれる方法がありました。

ありがたや!!

PHPでXMLを扱う方法

 

PHPでXMLを扱うにはおおまかに分けて以下の2パターンがありそう。
1.simpleXML
2.DOM

 

DOMとかよくわかってる人には2の方がやりやすいのかもしれませんが、初心者には1の方が簡単かな、という印象でした。

なので、私はSimpleXMLの方を当たり前のように採用(笑)

 

simpleXMLを使ってXMLを処理

 

なんでだか知りませんが、JsonDecodeを使って配列変換ができるそうです。JsonとXmlは親戚みたいなもんだからですかねー。謎。

コードは非常に簡単で、以下のような感じでXMLから配列に落としこんでくれます。すごく助かる!!

 

$xmlFilePath = "sample.xml";
$xmlData = simplexml_load_file($xmlFilePath);
$array = json_decode(json_encode($xmlData), true);
var_dump($array);

 

参考までに、使ったXMLと出力結果も載せときますね。

サンプルXML

<?xml version="1.0" encoding="UTF-8"?>
<bookStore>
	<storeCode>001</storeCode>
	<place>Tokyo</place>
	<stock>
		<book>
			<isbn>1234</isbn>
			<name>どんとこい超常現象!</name>
		</book>
		<book>
			<isbn>1233</isbn>
			<name>なぜベストを尽くさないのか?</name>
		</book>
	</stock>
</bookStore>

サンプルXMLの出力

出力結果はこんな感じ。

array(3) {
  ["storeCode"]=>
  string(3) "001"
  ["place"]=>
  string(5) "Tokyo"
  ["stock"]=>
  array(1) {
    ["book"]=>
    array(2) {
      [0]=>
      array(2) {
        ["isbn"]=>
        string(4) "1234"
        ["name"]=>
        string(30) "どんとこい超常現象!"
      }
      [1]=>
      array(2) {
        ["isbn"]=>
        string(4) "1233"
        ["name"]=>
        string(42) "なぜベストを尽くさないのか?"
      }
    }
  }
}

補足

ちなみに、属性(attribute)に関してもきちんと配列に格納されていて、$xml[“@attribute”][“id”] みたいな感じに「@attribute」の中にまとめられてます。

これは楽ちんでいいな!って思ったけど、foreachとかで回すときに@attributeが意外とめんどくさかったり。

自分でXMLを作るんだったら、attributeは使わずにXMLを生成しておいた方がのちのち楽ですね(´・ω・`)

 

そもそも属性ってなんのためにあるの??(笑)

 

※追記

いろいろ試しているうちに気付いたんですが、XMLにnamespace(名前空間)が使ってあると、上記のコードではデータが取得できませんでした。(配列$arrayが空っぽになっちゃいます…)

なので、namespaceが入ってくる場合には、別の方法を検討する必要があります。

 

配列からXMLに変換する

今回は自分はやらなかったのでやり方が書いてあるところをポイントするだけで…

 

PEARのXML_Serializerを利用する

< http://blog.livedoor.jp/clear_sky1430/archives/50031534.html >

 

SimpleXMLElementを使って配列をXMLに変換
< http://stabucky.com/wp/archives/4182 >

 

まぁ、他にもいろんなやり方がありそう。

 

おしまい。

俺の場合はXML→配列→XMLってやろうとしてたので、それなら最初から最後までXMLでいいのでは?という話になり変換はしなくなりました!!笑

というわけで以上備忘録でありました!

タイトルとURLをコピーしました