File_MARC_Record クラスを使用すると、 Machine Readable Cataloging (MARC) データを MARC 21 形式、可読形式の文字列および (制限はありますが) MARCXML 形式で書き出すことができます。
レコードを MARC 21 形式で返すには、 File_MARC_Record オブジェクトの toRaw() メソッドをコールします。
MARC 21 データのファイルへの書き込み
この例では、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 21 あるいは MARCXML レコードを返すには、 File_MARC_Record オブジェクトの __toString() メソッドをコールします。 File_MARC_Record オブジェクトの print() 関数をコールした際には、暗黙的に __toString() メソッドをコールしていることに注意しましょう。
MARC の可読形式を返す
この例では、各 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 形式で返すには、 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
の中で連結するのです。
MARCXML データのファイルへの書き込み
この例では、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);
?>