«前の日記(2007-03-01 (木)) 最新 次の日記(2007-03-09 (金))»  

まちゅダイアリー


2007-03-08 (木)

CSV ファイルから XML ファイルを生成する(やっつけ仕事)

Struts や何やらで、設定ファイルに XML を使うことが増えてきた。 XML のいいところは、フィールドに意味を持たせられることだけど、それだけ記述が冗長になってしまう。 特に、同じような記述が繰り返し出てくるような場合は、まず Excel でデータを作って、 CSV から変換した方が楽なんじゃないかと思った。 制限時間は30分。それ以上かかるなら、手で XML を書いたほうが早い。

最初、 Ruby で書こうかと思ったけど、 REXML の使い方に馴染んでないので、代わりに PHP を使うことにした。 PHP でも、 CSV ファイルを読み書きする fgetcsv という関数が用意されている。 XML のライブラリの使い方を覚えている暇はなかったので、 XML ファイルをそのまま PHP ファイルとして流用することにした。

以下はサンプル。 地名しりとりのフィードを CSV ファイルから生成している。 (もちろん、フィードのような標準的なフォーマットでいいなら、専用のライブラリを使った方がいい)

<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title type="html">地名しりとり</title>
  <author>
    <name>capping.machu.jp</name>
  </author>
  <link href="http://capping.machu.jp/" rel="alternate"/>
  <subtitle type="html"><?php include('title.txt') ?></subtitle>
  <updated>2007-03-10T01:12:53+00:00</updated>
  <id>urn:uuid:5343a9f7-6c59-55ce-b33c-c48634a3ea6d</id>
<?php
  $handle = fopen("test.csv", "r");
  while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    $title = $data[0];
    $link = $data[1];
    $content = $data[2];
    $updated = $data[3];
    $id = $data[4];
?>
  <entry xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><?php echo $title ?></title>
    <author>
      <name>n/a</name>
    </author>
    <link href="<?php echo htmlspecialchars($link) ?>" rel="alternate"/>
  <content type="html"><?php echo $content ?></content>
  <updated><?php echo $updated ?></updated>
  <id><?php echo $id ?></id>
  </entry>
<?php
  }
?>
</feed>

CSVファイルはこんな感じ。

目黒 (めぐろ),http://capping.machu.jp/,北海道幌泉郡えりも町目黒,2007-03-10T01:12:53+00:00,tag:001
駒込 (こまごめ),http://capping.machu.jp/,東京都豊島区駒込,2007-03-09T23:33:16+00:00,tag:002

あまりにもベタだけど、まぁそれなりには重宝している。 特に、 include を使って他のファイルをそのまま挿入できるのは便利。

Tags: memo PHP

PHP の落とし穴

でもしっかり落とし穴があった。 PHP は <?php ... ?> だけじゃなくて、 <? ... ?> の形式でも PHP プログラムと判断する。 なので、さっきのファイルの1行目の、

<?xml version="1.0" encoding="utf-8"?>

も PHP の命令だと勘違いして、うまく動かない。 PHP らしいといえば、 PHP らしい落とし穴。

これを回避するためには、一行目を以下のように書く(カッコ悪い…)。

<?php echo '<?xml version="1.0" encoding="utf-8"?>' ?>

もしくは、 php.ini にて short-open-tagを off にするか。

Tags: memo PHP