MARC データのフォーマット
MARC データのフォーマット –
File_MARC を使用した MARC データの整形
概要
File_MARC_Record クラスを使用すると、
Machine Readable Cataloging (MARC) データを
MARC 21 形式、可読形式の文字列および (制限はありますが)
MARCXML 形式で書き出すことができます。
MARC 21 形式への整形
レコードを MARC 21 形式で返すには、
File_MARC_Record オブジェクトの
toRaw() メソッドをコールします。
この例では、File_MARC_Record
で表される MARC レコードを作成し、配列
$records に保存します。
このデータを MARC 21 形式でファイルに書き込むには、
まずファイルをバイナリモードでオープンします。
そして配列内のレコードの内容をファイルに書き込むために
toRaw() メソッドをコールします。
これをレコードごとに繰り返します。
<?php
require 'File/MARC.php';
// convert_metadata_to_marc() は架空のメソッドで、
// File_MARC_Record オブジェクトの配列を返します
$records = convert_metadata_to_marc();
// バイナリ書き込みモードでファイルをオープンします
$marc21_file = fopen("records.mrc", "wb");
// レコードを順に処理します
while ($record = $records->next()) {
// 各レコードを、MARC 21 形式でファイルに書き込みます
fwrite($marc21_file, $record->toRaw());
}
// ファイルを閉じます
fclose($marc21_file);
?>
MARC データからの可読形式の出力の作成
可読形式で MARC 21 あるいは MARCXML レコードを返すには、
File_MARC_Record オブジェクトの
__toString() メソッドをコールします。
File_MARC_Record オブジェクトの
print() 関数をコールした際には、暗黙的に
__toString() メソッドをコールしていることに注意しましょう。
この例では、各 MARC レコードの内容を可読形式で表示します。
また、明示的に __toString() メソッドをコールし、
可読形式でファイルに書き込みます。入力形式が MARC あるいは
MARCXML のどちらであっても、出力用にデータを整形するメソッドは同じであることに注意しましょう。
<?php
require 'File/MARCXML.php';
// MARCXML レコード群を文字列から取得します
$journals = new File_MARCXML($xml_data, File_MARC::SOURCE_STRING);
// バイナリ書き込みモードでファイルをオープンします
$marc21_file = fopen("records.mrc", "wb");
// 取得したレコードを順に処理します
while ($record = $journals->next()) {
// 各レコードをきれいに表示します
print $record;
print "\n";
// きれいに整形したレコードをファイルに書き込みます
fwrite($marc21_file, $record->__toString() . "\n");
}
// ファイルを閉じます
fclose($marc21_file);
?>
MARCXML 形式への整形
レコードを MARCXML 形式で返すには、
File_MARC_Record オブジェクトの
toXML() メソッドをコールします。
toXML() メソッドの重要な制約
-
最も重要なのは、PHP では MARC8 エンコーディングからの変換を行わないということです。
このエンコーディングは既存の MARC レコードの多くで用いられていますが、
これを XML で有効なエンコーディング、たとえば UTF-8
などに変換することはありません。他言語版の MARC ライブラリは、
独自の文字エンコーディング変換ライブラリを作成することでこの問題に対応しているようです。
現時点では、File_MARC
の作者は同等の機能のサポートを PEAR パッケージとして組み込むだけの力がありません。
どなたか手伝ってくれる方を募集中です。
しかし、より望ましいのは、iconv や ICU ツールキットに
ANSEL および MARC8 エンコーディングのサポートを追加することでしょう。
iconv や ICU ツールキットは、さまざまな言語の多くのオープンソースプロジェクトで
エンコーディング変換に使用されています。
-
toXML() メソッドは、現在は
ひとつの File_MARC_Record オブジェクトに対して
ひとつの妥当な XML MARCXML ドキュメントを作成します。
ふたつの File_MARC_Record オブジェクトで
toXML() をコールした結果を単純に連結することはできません。
そうすると、出来上がった XML ドキュメントが妥当な形式ではなくなるからです。
複数のレコードを含む MARCXML ドキュメントを作成したい場合、
現状では開発者自身でそれを行う必要があります。つまり、各 MARCXML
ドキュメントの record ノードを取り出し、それを
ルート要素 collection の中で連結するのです。
この例では、File_MARC_Record
で表される MARC レコードを作成し、配列
$records に保存します。
このデータを MARCXML 形式でファイルに書き込むには、
まずファイルをバイナリモードでオープンします。
そして配列内のレコードの内容をファイルに書き込むために
toXML() メソッドをコールします。
<?php
require 'File/MARC.php';
// MARC レコードを作成します
$record = create_a_marc_record();
// バイナリ書き込みモードでファイルをオープンします
$marcxml_file = fopen("records.mrc", "wb");
// レコードを MARCXML 形式でファイルに書き込みます
fwrite($marcxml_file, $record->toXML());
// ファイルを閉じます
fclose($marcxml_file);
?>