2012年12月13日木曜日

SimpleXMLを使ってのXML操作(読み込み、書き込み・挿入)

  • このエントリーをはてなブックマークに追加

PHPにはSimpleXMLというとても便利なものがある。
今はtwitterも吐き出されるデータは全てjsonになっているかと思うけど、
RSS処理などそういった場合に使ったり、
フラッシュとの連携となると大体使われているのがXML。
それにjsonよりも可読性に優れているのでまだまだ使われるのではないかと思う。
そんなSimpleXMLの操作の仕方。

※simplexml_load_fileなどはPEARのモジュールを入れているか、PHP5以上でないと使用不可。
※PHP4の場合の読み込みについてはこちらを参照。

【読み込み】適当なデータを読み込む

//example.xml
<main>
  <hoge>
    <item>アイテム1</item>
    <item>アイテム2</item>
  </hoge>
  <foo>
    <item>
      <bar>バー</bar>
    </item>
    <item>
      <bar>フー</bar>
    </item>
  </foo>
  <name>
    <item id="1">ジョン</item>
    <item id="2">マイケル</item>
  </name>
</main>

$xml = simplexml_load_file("example.xml");

//hogeのitemを読み込み
//全部読み出し
foreach($xml->hoge->item as $val){
  echo $val;
}
//指定して読み出し
echo $xml->hoge->item[1];// アイテム2

//fooのitemのbarを読み込み
//全部読み出し
foreach($xml->foo->item as $val){
  echo $val->bar;
}
//指定して読み出し
echo $xml->foo->item[1]->bar;// フー

//nameのitemの属性を読み込み
echo $xml->name->item[1]['id'];// 2
とりあえずこんな感じ。

【書き込み・挿入】結果を挿入したりなど

上記のxmlに対して、値を増やしていきたいなということで挿入をする必要がある。
そのやり方は下のような感じ。

$xml = simplexml_load_file("example.xml");

//hogeにitemを追加
$target = $xml->xpath("/main/hoge");
$item = $target[0]->addChild("item","アイテム3");

//fooにitemを追加し、さらにその中にbarを追加
$target = $xml->xpath("/main/foo");
$item = $target[0]->addChild("item");
$item->addChild("bar","追加したバー");

//nameに属性付きitemを追加
//トムを追加したい
$target = $xml->xpath("/main/name");
$item = $target[0]->addChild("item","トム");
$item->addAttribute("id","300");
$item->addAttribute("class","all");
ポイントとしては下記の2つ。
・xpathを使用して、どこのノードがターゲットになるかを指定する。
※読込のように、$item = $xml->hoge->addChild("item","アイテム3")とやっても駄目。
・jsのDOMみたいな扱いだと思った方が早い。
特に属性を追加するといった場合は、作成した$itemオブジェクトにメソッドを使っているので。


ということで読み込みと書き込みを同じような感じでやったら駄目だなぁっていう話。

Adsense