westerndogの小屋

westerndogの小屋


- ほしいなぁと思って作ってみたWebサービスたちの開発Blog -

PHPでDOMを使って配列をXMLファイルにする

PHPでDOM(Document Object Model)を使用すると、文法的に正しい構造のXMLを、比較的容易に作成することができます。

XMLファイルの書き込みサンプル

makeXML.php

<?php
// 元データ
// 親ノードID(くっつき先)と子ノードID(自分)を含む
// 順番は問わない
// 木構造
// contents─1┬2─3
//           └4─5
$data = array(
  array(
    'parentId' => '',
    'childId' => '1',
    'comment' => 'comment1',
  ),
  array(
    'parentId' => '1',
    'childId' => '2',
    'comment' => 'comment1-1',
  ),
  array(
    'parentId' => '4',
    'childId' => '5',
    'comment' => 'comment1-2-1',
  ),
  array(
    'parentId' => '1',
    'childId' => '4',
    'comment' => 'comment1-2',
  ),
  array(
    'parentId' => '2',
    'childId' => '3',
    'comment' => 'comment1-1-1',
  ),
);

// 出力ファイル名
$fileName = 'comment.xml';

// DOMオブジェクト作成
$dom = new DomDocument('1.0');
$dom->encoding = "UTF-8";

// 出力XMLを改行
$dom->formatOutput = true;

// XML作成
$contents = $dom->appendChild($dom->createElement('contents'));

// 子ノードを追加
foreach($data as $array){
  $parentId = $array['parentId'];
  $childId = $array['childId'];

  // parentIdが無い場合contentsに付加
  if(empty($parentId)){
    $parentId = 'contents';
  }

  // 親ノードが無い場合
  if(empty($parentId)){
    $parentId = $dom->createElement('content');
  }

  // 子ノードが無い場合
  if(empty($childId)){
    $childId = $dom->createElement('content');
  }

  // 子ノードを付加
  $parentId->appendChild($childId);

  // 属性値を付加
  $childId->setAttribute('id', $childId);
  $childId->setAttribute('comment', $array['comment']);
}

//XMLを出力
file_put_contents($fileName, $dom->saveXML());
?>

実行例

$ php makeXML.php
$ cat comment.xml
<?xml version="1.0" encoding="UTF-8"?>
<contents>
  <content id="1" comment="comment1">
    <content id="2" comment="comment1-1">
      <content id="3" comment="comment1-1-1"/>
    </content>
    <content id="4" comment="comment1-2">
      <content id="5" comment="comment1-2-1"/>
    </content>
  </content>
</contents>

DOMの他の使い方は、DOMのリファレンスLink を参照してください。

— posted by westerndog at 01:37 am