gnu-social/plugins/LRDD/extlib/XML/XRD/Serializer/XML.php

137 lines
3.9 KiB
PHP

<?php
/**
* Part of XML_XRD
*
* PHP version 5
*
* @category XML
* @package XML_XRD
* @author Christian Weiske <cweiske@php.net>
* @license http://www.gnu.org/copyleft/lesser.html LGPL
* @link http://pear.php.net/package/XML_XRD
*/
/**
* Generate XML from a XML_XRD object.
*
* @category XML
* @package XML_XRD
* @author Christian Weiske <cweiske@php.net>
* @license http://www.gnu.org/copyleft/lesser.html LGPL
* @version Release: @package_version@
* @link http://pear.php.net/package/XML_XRD
*/
class XML_XRD_Serializer_XML
{
protected $xrd;
/**
* Create new instance
*
* @param XML_XRD $xrd XRD instance to convert to XML
*/
public function __construct(XML_XRD $xrd)
{
$this->xrd = $xrd;
}
/**
* Generate XML.
*
* @return string Full XML code
*/
public function __toString()
{
$hasXsi = false;
$x = new XMLWriter();
$x->openMemory();
//no encoding means UTF-8
//http://www.w3.org/TR/2008/REC-xml-20081126/#sec-guessing-no-ext-info
$x->startDocument('1.0', 'UTF-8');
$x->setIndent(true);
$x->startElement('XRD');
$x->writeAttribute('xmlns', 'http://docs.oasis-open.org/ns/xri/xrd-1.0');
$x->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
if ($this->xrd->id) {
$x->writeAttribute('xml:id', $this->xrd->id);
}
if ($this->xrd->expires !== null) {
$x->writeElement(
'Expires', gmdate('Y-m-d\TH:i:s\Z', $this->xrd->expires)
);
}
if ($this->xrd->subject !== null) {
$x->writeElement('Subject', $this->xrd->subject);
}
foreach ($this->xrd->aliases as $alias) {
$x->writeElement('Alias', $alias);
}
foreach ($this->xrd->properties as $property) {
$this->writeProperty($x, $property, $hasXsi);
}
foreach ($this->xrd->links as $link) {
$x->startElement('Link');
$x->writeAttribute('rel', $link->rel);
if ($link->type !== null) {
$x->writeAttribute('type', $link->type);
}
if ($link->href !== null) {
$x->writeAttribute('href', $link->href);
}
//template only when no href
if ($link->template !== null && $link->href === null) {
$x->writeAttribute('template', $link->template);
}
foreach ($link->titles as $lang => $value) {
$x->startElement('Title');
if ($lang) {
$x->writeAttribute('xml:lang', $lang);
}
$x->text($value);
$x->endElement();
}
foreach ($link->properties as $property) {
$this->writeProperty($x, $property, $hasXsi);
}
$x->endElement();
}
$x->endElement();
$x->endDocument();
$s = $x->flush();
if (!$hasXsi) {
$s = str_replace(
' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"', '', $s
);
}
return $s;
}
/**
* Write a property in the XMLWriter stream output
*
* @param XMLWriter $x Writer object to write to
* @param XML_XRD_Element_Property $property Property to write
* @param boolean &$hasXsi If an xsi: attribute is used
*
* @return void
*/
protected function writeProperty(
XMLWriter $x, XML_XRD_Element_Property $property, &$hasXsi
) {
$x->startElement('Property');
$x->writeAttribute('type', $property->type);
if ($property->value === null) {
$x->writeAttribute('xsi:nil', 'true');
$hasXsi = true;
} else {
$x->text($property->value);
}
$x->endElement();
}
}
?>