はてなダイアリーのXMLをパースしてCSV形式で出力しWordPressにインポートする
目的
はてなダイアリーに書いた記事を、はてな記法のままWordPressにインポートする
やりかた
- ダイアリーの管理画面から「はてなダイアリー形式」のxmlをエクスポート
- xmlをパースしてCSVに変換
- WordPressプラグイン「Really Simple CSV Importer」を使ってインポート
XMLをパースしてCSVに出力するPHPプログラム
材料
- index.php
- download.php
- hoge.xml
- はてなダイアリーのエクスポートデータ
ソース
index.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>はてなダイアリーのXMLをパースしてCSVで出力する</title>
</head>
<body>
<?php
/* 配列の見出し列を作成 */
$entries[] = array(
"post_id",
"post_name",
"post_author",
"post_date",
"post_type",
"post_status",
"post_title",
"post_content",
"post_category",
"post_tags",
);
/* はてなダイアリーのXMLをパース */
$xml = simplexml_load_file('hi3103.xml');
$json = json_encode($xml);
$array = json_decode($json,TRUE);
$days = $array["day"];
foreach($days as $day){
//dayタグのdate属性の内容を取得
$attr = $day["@attributes"];
$date = $attr["date"]; //yyy-mm-dd
$date = date('Y/n/j G:H',strtotime($date)); // yyyy/m/d 0:00 形式にする
//bodyタグの内容を取得
$body = $day["body"];
//bodyタグの内容を見出しごとに分割して配列に格納
$body = preg_split('/\*([0-9]{10})\*(.*?)\n/', $body, null, PREG_SPLIT_DELIM_CAPTURE);
//bodyから記事IDを取得
$id = $body[1];
//bodyからタイトル行を取得
$meta = $body[2];
//タイトルとタグを分割して配列に格納
$meta = preg_split('/\[|\]/', $meta, null, PREG_SPLIT_DELIM_CAPTURE);
//配列の中の空要素を削除する
$meta = array_filter($meta, "strlen");
//添字を振り直す
$meta = array_values($meta);
//配列から最後の要素を削除&削除した要素をtitleに格納
$title = array_pop($meta);
//残った配列をカンマ区切りの文字列としてtagに格納
$tag = implode(',', $meta);
//bodyから本文を取得
$content = $body[3];
//配列に格納
$entries[] = array(
// "post_id" =>
null,
// "post_name" =>
null,
// "post_author" =>
'hi3103',
// "post_date" =>
$date,
// "post_type" =>
'post',
// "post_status" =>
'draft',
// "post_title" =>
$title,
// "post_content" =>
$content,
// "post_category" =>
'hatena_diary',
// "post_tags" =>
$tag,
);
}
/* CSVファイルを出力*/
// ファイル名を日付から生成
date_default_timezone_set('Asia/Tokyo');
$filename = "hatena-diary-".date("YmdHis").".csv";
// ファイルポインタをオープン
$fp = fopen($filename, 'w');
//配列からcsvファイルへの書き込み
foreach ($entries as $fields) {
fputcsv($fp, $fields);
}
// ファイルポインタをクローズ
fclose($fp);
?>
<p><?php echo $filename; ?></p>
<form method="post" action="download.php">
<input type="hidden" name="filename" value="<?php echo $filename; ?>">
<input type="submit" value="ファイルをダウンロード">
</form>
</body>
</html>
- ダウンロードボタンをクリックするとdownload.phpが走る
download.php
<?php
if($_SERVER['HTTPS']=='on'){
$filename = $_POST['filename'];
// HTTPヘッダを設定
header('Content-Type: application/octet-stream');
header('Content-Length: '.filesize($filename));
header('Content-Disposition: attachment; filename='.$filename);
// ファイル出力
readfile($filename);
// ファイル削除
unlink($filename);
}
?>
- ファイルのダウンロードと削除を行う
参考URL
simpleXMLの扱い
-
リファレンス
配列などの扱い
- 【PHP】連想配列、配列への追加 – Qiita
- 正規表現で文字列を分割して配列に入れる
- 配列をn等分する
- 配列から空要素を削除する
- 配列から最後の要素を取り出す
- 配列をカンマ区切りの文字列に直す
- 多次元連想配列に格納する
- 日付のフォーマット