2013-05-14 05:54:50 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
class OAI2XML {
|
|
|
|
|
|
|
|
public $doc; // DOMDocument. Handle of current XML Document object
|
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
function __construct($uri, $verb, $request_args) {
|
2013-05-14 05:54:50 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
$this->verb = $verb;
|
2013-05-14 05:54:50 +02:00
|
|
|
$this->doc = new DOMDocument("1.0","UTF-8");
|
|
|
|
$oai_node = $this->doc->createElement("OAI-PMH");
|
|
|
|
$oai_node->setAttribute("xmlns","http://www.openarchives.org/OAI/2.0/");
|
|
|
|
$oai_node->setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
|
|
|
|
$oai_node->setAttribute("xsi:schemaLocation","http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd");
|
|
|
|
$this->addChild($oai_node,"responseDate",gmdate("Y-m-d\TH:i:s\Z"));
|
|
|
|
$this->doc->appendChild($oai_node);
|
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
$request = $this->addChild($this->doc->documentElement,"request",$uri);
|
|
|
|
$request->setAttribute('verb', $this->verb);
|
2013-05-14 05:54:50 +02:00
|
|
|
foreach($request_args as $key => $value) {
|
|
|
|
$request->setAttribute($key,$value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function display() {
|
|
|
|
$pr = new DOMDocument();
|
|
|
|
$pr->preserveWhiteSpace = false;
|
|
|
|
$pr->formatOutput = true;
|
|
|
|
$pr->loadXML($this->doc->saveXML());
|
|
|
|
echo $pr->saveXML();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add a child node to a parent node on a XML Doc: a worker function.
|
|
|
|
*
|
|
|
|
* @param $mom_node
|
|
|
|
* Type: DOMNode. The target node.
|
|
|
|
*
|
|
|
|
* @param $name
|
|
|
|
* Type: string. The name of child nade is being added
|
|
|
|
*
|
|
|
|
* @param $value
|
|
|
|
* Type: string. Text for the adding node if it is a text node.
|
|
|
|
*
|
|
|
|
* @return DOMElement $added_node
|
|
|
|
* The newly created node, can be used for further expansion.
|
|
|
|
* If no further expansion is expected, return value can be igored.
|
|
|
|
*/
|
|
|
|
|
|
|
|
function addChild($mom_node,$name, $value='') {
|
|
|
|
$added_node = $this->doc->createElement($name,$value);
|
|
|
|
$added_node = $mom_node->appendChild($added_node);
|
|
|
|
return $added_node;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
class OAI2XMLResponse extends OAI2XML {
|
2013-05-14 05:54:50 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
function __construct($verb, $request_args) {
|
|
|
|
parent::__construct($verb, $request_args);
|
|
|
|
$this->verbNode = $this->addChild($this->doc->documentElement,$this->verb);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add direct child nodes to verb node (OAI-PMH), e.g. response to ListMetadataFormats.
|
|
|
|
* Different verbs can have different required child nodes.
|
|
|
|
* \see create_record, create_header
|
|
|
|
*
|
|
|
|
* \param $nodeName Type: string. The name of appending node.
|
|
|
|
* \param $value Type: string. The content of appending node.
|
|
|
|
*/
|
|
|
|
function addToVerbNode($nodeName, $value=null) {
|
|
|
|
return $this->addChild($this->verbNode,$nodeName,$value);
|
|
|
|
}
|
2013-05-14 05:54:50 +02:00
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
/**
|
|
|
|
* Headers are enclosed inside of \<record\> to the query of ListRecords, ListIdentifiers and etc.
|
|
|
|
*
|
|
|
|
* \param $identifier Type: string. The identifier string for node \<identifier\>.
|
|
|
|
* \param $timestamp Type: timestamp. Timestapme in UTC format for node \<datastamp\>.
|
|
|
|
* \param $ands_class Type: mix. Can be an array or just a string. Content of \<setSpec\>.
|
|
|
|
* \param $add_to_node Type: DOMElement. Default value is null.
|
|
|
|
* In normal cases, $add_to_node is the \<record\> node created previously. When it is null, the newly created header node is attatched to $this->verbNode.
|
|
|
|
* Otherwise it will be attatched to the desired node defined in $add_to_node.
|
|
|
|
*/
|
|
|
|
function createHeader($identifier,$timestamp,$ands_class, $add_to_node=null) {
|
|
|
|
if(is_null($add_to_node)) {
|
|
|
|
$header_node = $this->addToVerbNode("header");
|
|
|
|
} else {
|
|
|
|
$header_node = $this->addChild($add_to_node,"header");
|
|
|
|
}
|
|
|
|
$this->addChild($header_node,"identifier",$identifier);
|
|
|
|
$this->addChild($header_node,"datestamp",$timestamp);
|
|
|
|
if (is_array($ands_class)) {
|
|
|
|
foreach ($ands_class as $setspec) {
|
|
|
|
$this->addChild($header_node,"setSpec",$setspec);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$this->addChild($header_node,"setSpec",$ands_class);
|
2013-05-14 05:54:50 +02:00
|
|
|
}
|
2013-05-14 21:46:15 +02:00
|
|
|
return $header_node;
|
2013-05-14 05:54:50 +02:00
|
|
|
}
|
|
|
|
|
2013-05-14 21:46:15 +02:00
|
|
|
/**
|
|
|
|
* If there are too many records request could not finished a resumpToken is generated to let harvester know
|
|
|
|
*
|
|
|
|
* \param $token Type: string. A random number created somewhere?
|
|
|
|
* \param $expirationdatetime Type: string. A string representing time.
|
|
|
|
* \param $num_rows Type: integer. Number of records retrieved.
|
|
|
|
* \param $cursor Type: string. Cursor can be used for database to retrieve next time.
|
|
|
|
*/
|
|
|
|
function createResumptionToken($token, $expirationdatetime, $num_rows, $cursor=null) {
|
|
|
|
$resump_node = $this->addChild($this->verbNode,"resumptionToken",$token);
|
|
|
|
if(isset($expirationdatetime)) {
|
|
|
|
$resump_node->setAttribute("expirationDate",$expirationdatetime);
|
|
|
|
}
|
|
|
|
$resump_node->setAttribute("completeListSize",$num_rows);
|
|
|
|
$resump_node->setAttribute("cursor",$cursor);
|
|
|
|
}
|
2013-05-14 05:54:50 +02:00
|
|
|
}
|