on Feb 9th, 2009Serialisera array till XML
För tillfället sitter jag och skriver en REST-service för en viss tjänst, och var i behov av en klass eller funktion för att serialisera en php-array till XML. Efter lite googlande hade jag dock inte hittat någon simpel klass för att göra detta, förrutom en PEAR-klass. Dock valde jag att inte använda denna då det inte finns stöd för PEAR där tjänsten kommer att hostas. Jag bestämde mig då för att knåpa ihop en egen klass, och detta är resultatet:
{
protected $rootnode;
public function __construct($rootnode)
{
// Use memory output
parent::openMemory();
parent::setIndent(true);
/* Use four spaces as indent */
parent::setIndentString(chr(0×20) .
chr(0×20) .
chr(0×20) .
chr(0×20)
);
$this->rootnode = $rootnode;
parent::startElement($this->rootnode);
}
public function startElement()
{
parent::startElement($this->rootnode);
}
public function serialize($data)
{
foreach($data as $key => $value)
{
if(is_array($value))
{
parent::startElement($key);
$this->serialize($value);
parent::endElement();
continue;
}
parent::writeElement($key, $value);
}
}
// Override function so that we dont need to call endElement by ourselves
public function output($flush)
{
parent::endElement();
return parent::outputMemory($flush);
}
}
Som ni ser är den välidgt, väldigt simpel, enbart med funktioner för att serialisera en array till php – inte vice versa. Kanske något att bygga in stöd för dock.
Här är ett simpelt exempel:
’status’ => ‘Success’,
‘data’ => array(
‘username’ => ‘Alexander Nyquist’,
‘password’ => ‘password’,
‘apikey’ => md5(‘password’)
)
);
$serializer = new XmlSerializer(‘response’);
$serializer->serialize($data);
echo $serializer->output(true);
Ovan resulterar i följande XML:
<status>Error</status>
<data>
<username>Alexander Nyquist</username>
<password>password</password>
<apikey>5f4dcc3b5aa765d61d8327deb882cf99</apikey>
</data>
</response>
Tack o hej!
Snyggt som fan. Bra jobbat.
Emil: Man tackar
Jag fattar inte vad den gör och inte hur den fungerar, men jag antar att jag kommer förstå allt om allt efter fredagens föreläsning?
/Snubben rakt fram