綾小路龍之介の素人思考

Perl > XML::TreePPでXMLサイトマップファイルを生成

perlで動く軽めのXMLパーサとしてXML::TreePPがある。これを用いてXMLのサイトマップを生成するcgiを作ってみよう。XMLパーサを使ってXMLサイトマップを作るなんてのは何番煎じになるのかわからないけれど、XML::TreePPを使ってサイズの大きくならないXMLファイルの生成について記事を書こうと思ったらこうなった。


目次


1.1 cgiファイルのソース

#!/usr/local/bin/perl -wT
use strict;
use warnings;
use DateTime;
use DateTime::Format::W3CDTF;
use XML::TreePP;


my @target = &set_target();
&make_sitemap(@target);
exit;

sub set_target
{
	opendir DIR, "./";
	my @target = grep{m/^\w+\.html$/} readdir DIR;
	closedir DIR;
	return @target;
}

sub set_priority
{
	my $mtime = shift;
	return sprintf("%2.1f", $_ eq 'index.html' ? 1.0 : 0.5);
}

sub set_lastmod
{
	my $mtime = shift;
	my $dt = DateTime->from_epoch( time_zone => 'Asia/Tokyo', epoch => $mtime );
	return DateTime::Format::W3CDTF->format_datetime($dt);
}


sub set_changefreq
{
	my $mtime = shift;
	my $changefreq = '';
	my $sub = time - $mtime;
	my $diff = 60;
	if ($sub < $diff ) {
		$changefreq = 'always';
	} elsif ($sub < ($diff *= 60)) {
		$changefreq = 'hourly';
	} elsif ($sub < ($diff *= 24)) {
		$changefreq = 'daily';
	} elsif ($sub < ($diff *= 7)) {
		$changefreq = 'weekly';
	} elsif ($sub < ($diff *= 30)) {
		$changefreq = 'monthly';
	} elsif ($sub < ($diff *= 12)) {
		$changefreq = 'yearly';
	} else {
		$changefreq = 'never';
	}
	return $changefreq;
}

sub set_url
{
	my $file = shift;
	my $mtime = (stat($file))[9];
	my $url = {
		changefreq => &set_changefreq($mtime),
		lastmod => &set_lastmod($mtime),
		loc => $file,
		priority =>  &set_priority($mtime),
	};
	return $url;
}


sub make_sitemap
{
	my $tpp = XML::TreePP->new();
	my $tree = {
		'urlset' => {
			'-xmlns' => 'http://www.google.com/schemas/sitemap/0.84',
			url => [
			],
		},
	};
	@{$tree->{urlset}->{url}} = map{&set_url($_)}@_;
	$tpp->writefile("./sitemap.xml", $tree);
	return;
}

__END__

1.1.1 set_target

サイトマップを生成したいファイルの配列を返す。

  1. perl 配列 戻り値 - Google 検索
  2. Perl 関数プログラム

1.1.2 make_sitemap

ファイルが書かれた配列引数を受け取って、それぞれのファイルについてurlタグの内容を生成するサブルーチンを呼び出す。生成されたハッシュをTreePPのwritefileでXMLに変換して書き込み

  1. sitemap.xml - Google 検索
  2. Google ウェブマスター ツール
  3. treepp writefile - Google 検索
  4. [Perl] XML::TreePP - Pure Perl実装によるXMLファイル展開モジュール

1.1.3 set_url

サイトマップを生成したいファイルを引数としてurlタグと対応した連想配列を返す。更新時間を元にurlタグの内容(loc, lastmod, changefreq, priorityタグ)を生成する。

  1. mtime perl stat - Google 検索
  2. Perlメモ/ファイルの更新時刻 - Walrus, Digit.

1.1.4 set_priority

ファイルの最終更新時間を引数として、priorityタグの内容を返す。このスクリプトでは最終更新時間を受け取っているがそれに関連した処理は行っていない。単純にindex.htmlはゲートページなのでこのプライオリティを1.0としてそれ以外は0.5にしている。もっと複雑なルールが必要ならばこのサブルーチンの中に書く。


1.1.5 set_lastmod

ファイルの最終更新時刻を引数として、lastmodタグの内容を返す。DataTimeと出力フォーマットのDateTime::Format::W3CDTFを使って、ファイルの最終更新時刻を適当な時刻フォーマット(W3C Datetime)に変換しているだけ。W3C DatetimeはISO8601で定義されているのでDateTime::Format::ISO8601を使うのが正攻法だが、このサブセットであるW3CDTFのほうが単純なのでDateTime::Format::W3CDTFを使っている。

  1. W3C Datetime - Google 検索
  2. Date and Time Formats
  3. Modules - Perl DateTime Wiki
  4. perl datetime - Google 検索
  5. DateTime - A date and time object - search.cpan.org
  6. DateTime::Format::W3CDTF - Parse and format W3CDTF datetime strings - search.cpan.org
  7. DateTime::Format::ISO8601 - Parses ISO8601 formats - search.cpan.org
  8. 日付の表記に関するノート
  9. DateTime - モダンなPerl入門 - モダンなPerl入門
  10. Perlにおける各種日付フォーマットの変換と比較 - 発声練習

1.1.6 set_changefreq

ファイルの最終更新時刻を引数として、changefreqタグの内容を返す。ファイルの最終更新時刻を元に、cgiが呼び出された時刻と比較して60秒以内に更新があったらalways、60*60秒以内なら'hourly'等の文字列を返す。更新頻度というよりも更新したタイミングからどのくらい経過したかという意味になっているのであまりよろしくないと思うけれど。


サイトマップ

  1. CSS > Webサイトのレイアウトの話
  2. DVDリッピングしてaviファイルにするときの計算方法
  3. Debian > インストールメモ
  4. Memo > One Line Diary
  5. Memo > To-Doリスト
  6. Memo > iswebの自動挿入広告の文字コードに関する考察
  7. Memo > リンクとメモ
  8. Memo > 物理屋の独り言
  9. Misc > High Performance Computing(HPC)
  10. PC過去の遺物集
  11. Perl > 1行スクリプト覚書 with Active Perl
  12. Perl > Perl実験室でWeb雑考
  13. Perl > XML::TreePPでXMLサイトマップファイルを生成
  14. Perl > e.cgi のページ ProjectRotation8
  15. Perl > クエリを連想配列で受け取るスマートな方法
  16. Perl > サーバーにアップロードしたcgiのエラーチェック
  17. Perl > ブリコラージュ的 cgi
  18. Programing > プログラムの素人が不思議に思ったこと
  19. Services > Gmail Tips
  20. Services > YourFileHostダウンローダ
  21. Services > twitterはじめました。
  22. Tech > MathMLを使ってみる
  23. Tech > Windows 2000 Professional でLaTeX組版システムを使う
  24. Tech > coLinuxの導入
  25. Tech > サイトのミラーリング
  26. Terapadで作るLaTeX統合環境
  27. Tools > Opera > 設定の諸々
  28. Tools > bashのメモ
  29. Tools > lit2ptoのページ
  30. Tools > vimの設定とtips
  31. Tools > よく使う機能のメモと設定のメモ
  32. VMware > ホストOSがWindows XP Home SP2でゲストOSがVine Linux 4.1
  33. Vine > SSHの暗号化経路を経由してSambaサーバの共有ディレクトリをマウント
  34. Vine Linux > LaTeXでpdf文書作成
  35. Vine Linux > Libretto L1に載せる
  36. Vine Linux > SSH関係の諸々メモ
  37. Vine Linux > サーバを立てたときのメモ
  38. Vine Linux > ソフトウェアRAID
  39. Vine Linux > デスクトップとして使う場合に必要な設定
  40. Wanderlust > inter7でIMAP4
  41. Web Etcetera > サーバー上でファイルを直接編集することについて
  42. Web Etcetera > 検索エンジンが自分のサイトをどのように認識しているか
  43. Web Etcetera > 無料ホームページスペースの広告削除は真か偽か
  44. Winamp > StreamRipperで全自動リッピング
  45. Winamp > タスクマネージャを使って目覚まし時計
  46. Windows > robocopyでフォルダ間同期
  47. Windows > 手動でコーデックをインストールする
  48. gnuplotのプロットギャラリー
  49. rsyncでディレクトリの内容を同期する
  50. wgetのメモ
  51. ネットワーク上にメモ帳を置く
  52. ハードウェア > HDDの再利用
  53. ハードウェア > 安定で快適なマシンはハードから
  54. ブリコラージュ的メールマガジン一括登録解除方法
  55. 初めに
  56. 情報基礎演習UNIX
  57. 窓たちと正く付き合うにはショートカットキーから

コメント


pin

[PR]肢Ղ̗p⏉񖳗:KȌ֓܂{iӒ