<?php
/**
*
* MODS XML to SENAYAN converter
*
* Copyright (C) 2010 Hendro Wicaksono (hide@address.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
define('MODS_XML_PARSE_ERROR', 199);
/**
* MODS XML parser for SENAYAN 3
* @param string $str_modsxml: can be string, file or uri
* @return array
**/
function modsXMLsenayan($str_modsxml, $str_xml_type = 'string')
{
// initiate records array
$_records = array();
libxml_use_internal_errors(true);
// load XML
if ($str_xml_type == 'file') {
// load from file
if (file_exists($str_modsxml)) {
$xml = @simplexml_load_file($str_modsxml);
} else {
return 'File '.$str_modsxml.' not found! Please supply full path to MODS XML file';
}
} else {
// load from string
try {
// check if type is URI
if ($str_xml_type == 'uri') {
$xml = new SimpleXMLElement($str_modsxml, LIBXML_NSCLEAN, true);
} else {
$xml = new SimpleXMLElement($str_modsxml, LIBXML_NSCLEAN);
}
} catch (Exception $xmlerr) {
return MODS_XML_PARSE_ERROR;
// die($xmlerr->getMessage());
}
}
// get result information from SLiMS Namespaced node
$_slims = $xml->children('http://senayan.diknas.go.id');
if ($_slims) {
if (isset($_slims->resultInfo)) {
$_records['result_num'] = (integer)$_slims->resultInfo->modsResultNum;
$_records['result_page'] = (integer)$_slims->resultInfo->modsResultPage;
$_records['result_showed'] = (integer)$_slims->resultInfo->modsResultShowed;
} else {
$_records['result_num'] = (integer)$_slims->modsResultNum;
$_records['result_page'] = (integer)$_slims->modsResultPage;
$_records['result_showed'] = (integer)$_slims->modsResultShowed;
}
} else {
$_records['result_num'] = isset($xml->modsResultNum)?$xml->modsResultNum:'';
$_records['result_page'] = isset($xml->modsResultPage)?$xml->modsResultPage:'';
$_records['result_showed'] = isset($xml->modsResultShowed)?$xml->modsResultShowed:'';
}
$record_num = 0;
// start iterate records
foreach($xml->mods as $record) {
$data = array();
$data['id'] = (string)$record['ID'];
# authors
$data['authors'] = array();
# title
$data['title'] = (string)$record->titleInfo->title;
if (isset($record->titleInfo->subTitle)) {
$data['title'] .= (string)$record->titleInfo->subTitle;
}
# name/author (repeatable)
if (isset($record->name) AND $record->name) {
foreach ($record->name as $value) {
$_author_type = $value['type'];
if ($value->role->roleTerm == 'Primary Author') {
$_level = 1;
} else {
$_level = 2;
}
$data['authors'][] = array('name' => (string)$value->namePart, 'authority_list' => (string)$value['authority'], 'level' => $_level, 'author_type' => (string)$_author_type);
}
}
# mods->typeOfResource
$data['manuscript'] = (boolean)$record->typeOfResource['manuscript'] == 'yes';
$data['collection'] = (boolean)$record->typeOfResource['collection'] == 'yes';
$data['resource_type'] = (string)$record->typeOfResource;
# mods->genre
$data['genre_authority'] = (string)$record->genre['authority'];
$data['genre'] = (string)$record->genre;
# mods->originInfo
$data['publish_place'] = isset($record->originInfo->place->placeTerm)?(string)$record->originInfo->place->placeTerm:'';
$data['publisher'] = (string)$record->originInfo->publisher;
$data['publish_year'] = (string)$record->originInfo->dateIssued;
$data['issuance'] = (string)$record->originInfo->issuance;
$data['edition'] = (string)$record->originInfo->edition;
# mods->language
if (isset($record->language->languageTerm)) {
foreach ($record->language->languageTerm as $_langterm) {
if ($_langterm['type'] == 'code') {
$data['language']['code'] = (string)$_langterm;
} else {
$data['language']['name'] = (string)$_langterm;
}
}
}
# mods->physicalDescription
$data['gmd'] = (string)$record->physicalDescription->form;
$data['collation'] = (string)$record->physicalDescription->extent;
# mods->relatedItem
if ($record->relatedItem['type'] == 'series') {
$data['series_title'] = (string)$record->relatedItem->titleInfo->title;
}
# mods->note
$data['notes'] = (string)$record->note;
# mods->subject
foreach ($record->subject as $_subj) {
$_authority = (string)$_subj['authority'];
if (isset($_subj->topic)) {
$_term_type = 'topical';
$_term = (string)$_subj->topic;
}
if (isset($_subj->geographic)) {
$_term_type = 'geographic';
$_term = (string)$_subj->geographic;
}
if (isset($_subj->name)) {
$_term_type = 'name';
$_term = (string)$_subj->name;
}
if (isset($_subj->temporal)) {
$_term_type = 'temporal';
$_term = (string)$_subj->temporal;
}
if (isset($_subj->genre)) {
$_term_type = 'genre';
$_term = (string)$_subj->genre;
}
if (isset($_subj->occupation)) {
$_term_type = 'occupation';
$_term = (string)$_subj->occupation;
}
$data['subjects'][] = array('term' => $_term, 'term_type' => $_term_type, 'authority' => $_authority);
}
# mods->classification
$data['classification'] = (string)$record->classification;
# mods->identifier
if ($record->identifier['type'] == 'isbn') {
$data['isbn_issn'] = (string)$record->identifier;
}
# mods->location
$data['location'] = (string)$record->location->physicalLocation;
$data['call_number'] = (string)$record->location->shelfLocator;
# mods->recordInfo
if (isset($record->recordInfo)) {
$data['id'] = (string)$record->recordInfo->recordIdentifier;
$data['create_date'] = (string)$record->recordInfo->recordCreationDate;
$data['modified_date'] = (string)$record->recordInfo->recordChangeDate;
$data['origin'] = (string)$record->recordInfo->recordOrigin;
}
$_records['records'][] = $data;
$record_num++;
}
return $_records;
}
?>