/** 
  * Render the records as RDF in a rdf/xml serialization following the TDWG
  *  DarwinCore RDF Guide.
  *
  * @return string containing rdf/xml serialization of selected dwc records.
  */
 public function getAsRdfXml()
 {
     $debug = false;
     $newDoc = new DOMDocument('1.0', $this->charSetOut);
     $newDoc->formatOutput = true;
     $rootElem = $newDoc->createElement('rdf:RDF');
     $rootElem->setAttribute('xmlns:rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#');
     $rootElem->setAttribute('xmlns:rdfs', 'http://www.w3.org/2000/01/rdf-schema#');
     $rootElem->setAttribute('xmlns:owl', 'http://www.w3.org/2002/07/owl#');
     $rootElem->setAttribute('xmlns:foaf', 'http://xmlns.com/foaf/0.1/');
     $rootElem->setAttribute('xmlns:dwc', 'http://rs.tdwg.org/dwc/terms/');
     $rootElem->setAttribute('xmlns:dwciri', 'http://rs.tdwg.org/dwc/iri/');
     $rootElem->setAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/');
     $rootElem->setAttribute('xmlns:dcterms', 'http://purl.org/dc/terms/');
     $rootElem->setAttribute('xmlns:dcmitype', 'http://purl.org/dc/dcmitype/');
     $newDoc->appendChild($rootElem);
     $this->schemaType = 'dwc';
     $arr = $this->getDwcArray();
     $occurTermArr = $this->occurrenceFieldArr['terms'];
     foreach ($arr as $rownum => $dwcArray) {
         if ($debug) {
             print_r($dwcArray);
         }
         if (isset($dwcArray['occurrenceID']) || isset($dwcArray['catalogNumber']) && isset($dwcArray['collectionCode'])) {
             $occurrenceid = $dwcArray['occurrenceID'];
             if (UuidFactory::is_valid($occurrenceid)) {
                 $occurrenceid = "urn:uuid:{$occurrenceid}";
             } else {
                 $catalogNumber = $dwcArray['catalogNumber'];
                 if (strlen($occurrenceid) == 0 || $occurrenceid == $catalogNumber) {
                     // If no occurrenceID is present, construct one with a urn:catalog: scheme.
                     // Pathology may also exist of an occurrenceID equal to the catalog number, fix this.
                     $institutionCode = $dwcArray['institutionCode'];
                     $collectionCode = $dwcArray['collectionCode'];
                     $occurrenceid = "urn:catalog:{$institutionCode}:{$collectionCode}:{$catalogNumber}";
                 }
             }
             $occElem = $newDoc->createElement('dwc:Occurrence');
             $occElem->setAttribute("rdf:about", "{$occurrenceid}");
             $sameAsElem = null;
             foreach ($dwcArray as $key => $value) {
                 $flags = ENT_NOQUOTES;
                 if (defined('ENT_XML1')) {
                     $flags = ENT_NOQUOTES | ENT_XML1 | ENT_DISALLOWED;
                 }
                 $value = htmlentities($value, $flags, $this->charSetOut);
                 // TODO: Figure out how to use mb_encode_numericentity() here.
                 $value = str_replace("©", "©", $value);
                 // workaround, need to fix © rendering
                 if (strlen($value) > 0) {
                     $elem = null;
                     switch ($key) {
                         case "recordId":
                         case "occurrenceID":
                         case "verbatimScientificName":
                             // skip
                             break;
                         case "collectionID":
                             // RDF Guide Section 2.3.3 owl:sameAs for urn:lsid and resolvable IRI.
                             if (stripos("urn:uuid:", $value) === false && UuidFactory::is_valid($value)) {
                                 $lsid = "urn:uuid:{$value}";
                             } elseif (stripos("urn:lsid:biocol.org", $value) === 0) {
                                 $lsid = "http://biocol.org/{$value}";
                                 $sameAsElem = $newDoc->createElement("rdf:Description");
                                 $sameAsElem->setAttribute("rdf:about", "http://biocol.org/{$value}");
                                 $sameAsElemC = $newDoc->createElement("owl:sameAs");
                                 $sameAsElemC->setAttribute("rdf:resource", "{$value}");
                                 $sameAsElem->appendChild($sameAsElemC);
                             } else {
                                 $lsid = $value;
                             }
                             $elem = $newDoc->createElement("dwciri:inCollection");
                             $elem->setAttribute("rdf:resource", "{$lsid}");
                             break;
                         case "basisOfRecord":
                             if (preg_match("/(PreservedSpecimen|FossilSpecimen)/", $value) == 1) {
                                 $elem = $newDoc->createElement("rdf:type");
                                 $elem->setAttribute("rdf:resource", "http://purl.org/dc/dcmitype/PhysicalObject");
                             }
                             $elem = $newDoc->createElement("dwc:{$key}", $value);
                             break;
                         case "rights":
                             // RDF Guide Section 3.3 dcterms:licence for IRI, xmpRights:UsageTerms for literal
                             if (stripos("http://creativecommons.org/licenses/", $value) == 0) {
                                 $elem = $newDoc->createElement("dcterms:license");
                                 $elem->setAttribute("rdf:resource", "{$value}");
                             } else {
                                 $elem = $newDoc->createElement("xmpRights:UsageTerms", $value);
                             }
                             break;
                         case "rightsHolder":
                             // RDF Guide Section 3.3  dcterms:rightsHolder for IRI, xmpRights:Owner for literal
                             if (stripos("http://", $value) == 0 || stripos("urn:", $value) == 0) {
                                 $elem = $newDoc->createElement("dcterms:rightsHolder");
                                 $elem->setAttribute("rdf:resource", "{$value}");
                             } else {
                                 $elem = $newDoc->createElement("xmpRights:Owner", $value);
                             }
                             break;
                         case "modified":
                             $elem = $newDoc->createElement("dcterms:{$key}", $value);
                             break;
                         case "day":
                         case "month":
                         case "year":
                             if ($value != "0") {
                                 $elem = $newDoc->createElement("dwc:{$key}", $value);
                             }
                             break;
                         case "eventDate":
                             if ($value != "0000-00-00" || strlen($value) > 0) {
                                 $value = str_replace("-00", "", $value);
                                 $elem = $newDoc->createElement("dwc:{$key}", $value);
                             }
                             break;
                         default:
                             if (isset($occurTermArr[$key])) {
                                 $ns = RdfUtility::namespaceAbbrev($occurTermArr[$key]);
                                 $elem = $newDoc->createElement($ns);
                                 $elem->appendChild($newDoc->createTextNode($value));
                             }
                     }
                     if ($elem != null) {
                         $occElem->appendChild($elem);
                     }
                 }
             }
             $node = $newDoc->importNode($occElem);
             $newDoc->documentElement->appendChild($node);
             if ($sameAsElem != null) {
                 $node = $newDoc->importNode($sameAsElem);
                 $newDoc->documentElement->appendChild($node);
             }
             // For many matching rows this is a point where partial serialization could occur
             // to prevent creation of a large DOM model in memmory.
         }
     }
     $returnvalue = $newDoc->saveXML();
     return $returnvalue;
 }
Beispiel #2
0
<?php

include_once '../config/symbini.php';
include_once $serverRoot . '/classes/AgentManager.php';
include_once $serverRoot . '/classes/RdfUtility.php';
include_once $serverRoot . '/classes/UuidFactory.php';
// Find out what media types the client would like, in order.
$accept = RdfUtility::parseHTTPAcceptHeader($_SERVER['HTTP_ACCEPT']);
$force = array_key_exists("force", $_REQUEST) ? $_REQUEST["force"] : "";
$agentid = preg_replace('[^0-9]', '', array_key_exists("agentid", $_REQUEST) ? $_REQUEST["agentid"] : "");
$uuid = array_key_exists("uuid", $_REQUEST) ? $_REQUEST["uuid"] : "";
$findobjects = preg_replace('[^0-9]', '', array_key_exists("findobjects", $_REQUEST) ? $_REQUEST["findobjects"] : "");
$agent = new Agent();
$agentview = new AgentView();
if (strlen($agentid) > 0) {
    $agent->load($agentid);
    $agentview->setModel($agent);
} elseif (strlen($uuid) > 0) {
    if (UuidFactory::is_valid($uuid)) {
        $agent->loadByGUID($uuid);
        $agentview->setModel($agent);
    }
}
$done = FALSE;
if ($force == 'turtle') {
    deliverTurtle();
    $done = TRUE;
}
if ($force == 'rdfxml') {
    deliverRdfXml();
    $done = TRUE;