File_MARC を使用すると、MARC 21 フォーマットの Machine Readable Cataloging (MARC) データを読み込むことができます。 File_MARC に同梱されている File_MARCXML を使用すると、 MARCXML 形式のデータを読み込むことができます。
入力元は、PHP のストリーム (File_MARC::SOURCE_FILE) あるいは文字列 (File_MARC::SOURCE_STRING) となります。 File_MARC および File_MARCXML のコンストラクタで、最初の引数としてソースの位置を、 二番目の引数としてソースの形式を指定します。
ファイルからの MARC 21 データの読み込み
この例では、MARC21 データが journals.mrc
という名前でディスク上に保存されているものとします。
MARCX21 データを読み込むには、File_MARC
のコンストラクタをコールします。File_MARC に対して、
journals.mrc
がファイル名なのか MARC
データストリームを指しているのかを指定する必要はありません。
File_MARC のコンストラクタの第二引数は、
デフォルトで File_MARC::SOURCE_FILE となるからです。
<?php
require 'File/MARC.php';
// MARC レコードをファイルから取得します
$journals = new File_MARC('journals.mrc');
// 取得したレコードを順に処理します
while ($record = $journals->next()) {
// 各レコードをきれいに表示します
print $record;
print "\n";
}
?>
文字列からの MARCXML データの読み込み
この例では、あるウェブサービスから返された MARCXML
データが PHP の変数 $xml_data
に文字列で格納されているものとします。
MARCXML データを読み込むには、File_MARCXML
のコンストラクタをコールします。$xml_data
が文字列であることを File_MARCXML に教えるため、
コンストラクタの第二引数で File_MARC::SOURCE_STRING
を指定します。
<?php
require 'File/MARCXML.php';
// MARCXML レコードを文字列から取得します
$journals = new File_MARCXML($xml_data, File_MARC::SOURCE_STRING);
// 取得したレコードを順に処理します
while ($record = $journals->next()) {
// 各レコードをきれいに表示します
print $record;
print "\n";
}
?>
File_MARC オブジェクトは、先頭部の情報の後に File_MARC_Record オブジェクトが順に並ぶ形式となります。 これが MARC レコードを表します。また、各レコードオブジェクトは、それぞれ File_MARC_Data_Field あるいは File_MARC_Control_Field オブジェクトの繰り返しになります。 これが MARC フィールドを表します。 File_MARC_Data_Field の中身は File_MARC_Subfield オブジェクトの繰り返しとなり、 これが MARC サブフィールドを表します。
レコードの要素の表示
<?php
require 'File/MARC.php';
// MARC レコード群を取得します
$bibrecords = new File_MARC('catdump.mrc', File_MARC::SOURCE_FILE);
// 取得したレコードを順に処理します
while ($record = $bibrecords->next()) {
// 先頭部を表示します
print $record->getLeader();
$subjects = $record->getFields('650');
if ($subjects) {
// 最初の 24_ フィールドを取得します
print $record->getField('24.', true);
print "\n";
// 取得した件名をすべて表示します
foreach ($subjects as $field) {
print $field;
print "\n";
}
print "\n";
}
}
?>
つまり、File_MARC を使用すると、MARC レコードを読み込んで
その中の特定のフィールドやサブフィールドの内容を取得することが簡単にできます。
File_MARC には、いちいち順次処理をしなくても
特定のフィールドを簡単に読み込めるようにするメソッドもあります。
getField
は、
該当するフィールド名の最初のレコードを返します。また
getFields
は、
該当する名前のフィールドをすべて含む配列を返します。
これらのメソッドはどちらも、オプションで boolean 型のパラメータを指定できます。
これは、指定した文字列を Perl 互換の正規表現として扱うかどうかを指定するものです。
レコードからのすべての 650 フィールドの取得
<?php
require 'File/MARC.php';
// MARC レコードを z39 結果文字列から取得します
$bibrecords = new File_MARC($z39_result, File_MARC::SOURCE_STRING);
// 取得したレコードを順に処理します
while ($record = $bibrecords->next()) {
// すべての 650 フィールドを配列で取得します
$subjects = $record->getFields('650');
if ($subjects) {
// 最初の 24_ フィールドのみを取得します
print $record->getField('24.', true);
print "\n";
// 取得した件名をすべて表示します
foreach ($subjects as $field) {
print $field;
print "\n";
}
print "\n";
}
}
?>
File_MARC_Data_Field オブジェクトを foreach() で順に処理する際には、 指定したフィールドの MARC タグがキーとして返されます。 また、対応する値には、サブフィールド群が返されます。
同様に、File_MARC_Subfield オブジェクトを foreach() で順に処理する際には、 指定したサブフィールドのコードがキーとして返されます。 また、対応する値には、そのサブフィールドの値が返されます。
MARC レコード内のフィールドとサブフィールドの順次処理
この例では、650 フィールドを順に処理し、各フィールドの サブフィールドにある件名の見出しを表示します。
<?php
require 'File/MARC.php';
// z39 結果文字列から MARC レコード群を取得します
$bibrecords = new File_MARC($z39_result, File_MARC::SOURCE_STRING);
// 各レコードを処理します
while ($record = $bibrecords->next()) {
// フィールドを順に処理します
foreach ($record->getFields() as $tag => $subfields) {
// 650 フィールド以外は読み飛ばします
if ($tag == '650') {
print "Subject:";
foreach ($subfields->getSubfields() as $code => $value) {
print " $value";
}
print "\n";
}
}
}
?>
データフィールドは File_MARC_Data_Field クラスで表されます。 このクラスの関数 getIndicator() を使用すると、 インジケータの値を取得することができます。
インジケータの取得
この例では、MARC レコードのタイトル (245) フィールドを取得し、 そのフィールドの二番目のインジケータを調べます。これによって、そのフィールドに 並べ替えの際に無視すべき非ファイリングインジケータがあるかどうかを判断します。
<?php
require 'File/MARC.php';
$titleField = $record->getField('245');
$nonfiling = $titleField->getIndicator(2);
if ($nonfiling) {
// $a サブフィールドの一部を使用して並べ替えます
$title = substr($titleField->getSubfield('a'), $nonfiling);
} else {
// $a サブフィールド全体を使用して並べ替えます
$title = $titleField->getSubfield('a');
}
?>