137 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			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(); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | ?>
 |