propertyUris()); $rpcount = $this->reversePropertyCount($obj); $alreadyOutput = isset($this->outputtedResources[$obj->getUri()]); $tag = "$indent<$property"; if ($obj->isBNode()) { if ($alreadyOutput or $rpcount > 1 or $pcount == 0) { $tag .= " rdf:nodeID=\"".htmlspecialchars($obj->getBNodeId()).'"'; } } else { if ($alreadyOutput or $rpcount != 1 or $pcount == 0) { $tag .= " rdf:resource=\"".htmlspecialchars($obj->getURI()).'"'; } } if ($alreadyOutput == false and $rpcount == 1 and $pcount > 0) { $xml = $this->rdfxmlResource($obj, false, $depth+1); if ($xml) { return "$tag>$xml$indent\n\n"; } else { return ''; } } else { return $tag."/>\n"; } } elseif (is_object($obj) and $obj instanceof EasyRdf_Literal) { $atrributes = ""; $datatype = $obj->getDatatypeUri(); if ($datatype) { if ($datatype == self::RDF_XML_LITERAL) { $atrributes .= " rdf:parseType=\"Literal\""; $value = strval($obj); } else { $datatype = htmlspecialchars($datatype); $atrributes .= " rdf:datatype=\"$datatype\""; } } elseif ($obj->getLang()) { $atrributes .= ' xml:lang="'. htmlspecialchars($obj->getLang()).'"'; } // Escape the value if (!isset($value)) { $value = htmlspecialchars(strval($obj)); } return "$indent<$property$atrributes>$value\n"; } else { throw new EasyRdf_Exception( "Unable to serialise object to xml: ".getType($obj) ); } } /** * Protected method to serialise a whole resource and its properties * @ignore */ protected function rdfxmlResource($res, $showNodeId, $depth = 1) { // Keep track of the resources we have already serialised if (isset($this->outputtedResources[$res->getUri()])) { return ''; } else { $this->outputtedResources[$res->getUri()] = true; } // If the resource has no properties - don't serialise it $properties = $res->propertyUris(); if (count($properties) == 0) { return ''; } $type = $res->type(); if ($type) { $this->addPrefix($type); } else { $type = 'rdf:Description'; } $indent = str_repeat(' ', $depth); $xml = "\n$indent<$type"; if ($res->isBNode()) { if ($showNodeId) { $xml .= ' rdf:nodeID="'.htmlspecialchars($res->getBNodeId()).'"'; } } else { $xml .= ' rdf:about="'.htmlspecialchars($res->getUri()).'"'; } $xml .= ">\n"; if ($res instanceof EasyRdf_Container) { foreach ($res as $item) { $xml .= $this->rdfxmlObject('rdf:li', $item, $depth+1); } } else { foreach ($properties as $property) { $short = EasyRdf_Namespace::shorten($property, true); if ($short) { $this->addPrefix($short); $objects = $res->all("<$property>"); if ($short == 'rdf:type') { array_shift($objects); } foreach ($objects as $object) { $xml .= $this->rdfxmlObject($short, $object, $depth+1); } } else { throw new EasyRdf_Exception( "It is not possible to serialse the property ". "'$property' to RDF/XML." ); } } } $xml .= "$indent\n"; return $xml; } /** * Method to serialise an EasyRdf_Graph to RDF/XML * * @param EasyRdf_Graph $graph An EasyRdf_Graph object. * @param string $format The name of the format to convert to. * @param array $options * @throws EasyRdf_Exception * @return string The RDF in the new desired format. */ public function serialise($graph, $format, array $options = array()) { parent::checkSerialiseParams($graph, $format); if ($format != 'rdfxml') { throw new EasyRdf_Exception( "EasyRdf_Serialiser_RdfXml does not support: $format" ); } // store of namespaces to be appended to the rdf:RDF tag $this->prefixes = array('rdf' => true); // store of the resource URIs we have serialised $this->outputtedResources = array(); $xml = ''; // Serialise URIs first foreach ($graph->resources() as $resource) { if (!$resource->isBnode()) { $xml .= $this->rdfxmlResource($resource, true); } } // Serialise bnodes afterwards foreach ($graph->resources() as $resource) { if ($resource->isBnode()) { $xml .= $this->rdfxmlResource($resource, true); } } // iterate through namepsaces array prefix and output a string. $namespaceStr = ''; foreach ($this->prefixes as $prefix => $count) { $url = EasyRdf_Namespace::get($prefix); if (strlen($namespaceStr)) { $namespaceStr .= "\n "; } $namespaceStr .= ' xmlns:'.$prefix.'="'.htmlspecialchars($url).'"'; } return "\n". "\n" . $xml . "\n\n"; } }