You are here

class EasyRdf_Serialiser_RdfXml in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/easyrdf/easyrdf/lib/EasyRdf/Serialiser/RdfXml.php \EasyRdf_Serialiser_RdfXml

Class to serialise an EasyRdf_Graph to RDF/XML with no external dependancies.

@package EasyRdf @copyright Copyright (c) 2009-2013 Nicholas J Humfrey @license http://www.opensource.org/licenses/bsd-license.php

Hierarchy

Expanded class hierarchy of EasyRdf_Serialiser_RdfXml

1 string reference to 'EasyRdf_Serialiser_RdfXml'
Format.php in vendor/easyrdf/easyrdf/lib/EasyRdf/Format.php

File

vendor/easyrdf/easyrdf/lib/EasyRdf/Serialiser/RdfXml.php, line 45

View source
class EasyRdf_Serialiser_RdfXml extends EasyRdf_Serialiser {
  private $outputtedResources = array();

  /** A constant for the RDF Type property URI */
  const RDF_XML_LITERAL = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral';

  /**
   * Protected method to serialise an object node into an XML object
   * @ignore
   */
  protected function rdfxmlObject($property, $obj, $depth) {
    $indent = str_repeat('  ', $depth);
    if ($property[0] === ':') {
      $property = substr($property, 1);
    }
    if (is_object($obj) and $obj instanceof EasyRdf_Resource) {
      $pcount = count($obj
        ->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}</{$property}>\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}</{$property}>\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' && $type != 'rdf:Description') {
            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}</{$type}>\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        ";
      }
      if (strlen($prefix) === 0) {
        $namespaceStr .= ' xmlns="' . htmlspecialchars($url) . '"';
      }
      else {
        $namespaceStr .= ' xmlns:' . $prefix . '="' . htmlspecialchars($url) . '"';
      }
    }
    return "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" . "<rdf:RDF" . $namespaceStr . ">\n" . $xml . "\n</rdf:RDF>\n";
  }

}

Members

Namesort descending Modifiers Type Description Overrides
EasyRdf_Serialiser::$prefixes protected property
EasyRdf_Serialiser::addPrefix protected function Keep track of the prefixes used while serialising @ignore
EasyRdf_Serialiser::checkSerialiseParams protected function Check and cleanup parameters passed to serialise() method @ignore
EasyRdf_Serialiser::reversePropertyCount protected function Protected method to get the number of reverse properties for a resource If a resource only has a single property, the number of values for that property is returned instead. @ignore
EasyRdf_Serialiser::__construct public function 4
EasyRdf_Serialiser_RdfXml::$outputtedResources private property
EasyRdf_Serialiser_RdfXml::rdfxmlObject protected function Protected method to serialise an object node into an XML object @ignore
EasyRdf_Serialiser_RdfXml::rdfxmlResource protected function Protected method to serialise a whole resource and its properties @ignore
EasyRdf_Serialiser_RdfXml::RDF_XML_LITERAL constant A constant for the RDF Type property URI
EasyRdf_Serialiser_RdfXml::serialise public function Method to serialise an EasyRdf_Graph to RDF/XML Overrides EasyRdf_Serialiser::serialise