Янв 232012
 

Возникла необходимость сделать серверную часть, отдающую данные в формате XML.
Сам привык использовать JSON, но так как софт пишется на .NET C#, то решил использовать более родную для него структуру.
Работает с помощью XMLWriter.

Для тестов был выбран следующий массив:

$info = array(
    'id' => 123,
    'login' => 'bafoed',
    'password' => '5f4dcc3b5aa765d61d8327deb882cf99',
    'email' => '[email protected]',
    'active' => true,
    'languages' => array('PHP', 'Javascript', 'C#')
);


json_encode():

{
   "id": 123,
   "login": "bafoed",
   "password": "5f4dcc3b5aa765d61d8327deb882cf99",
   "email": "[email protected]",
   "active": true,
   "languages": [
      "PHP",
      "Javascript",
      "C#"
   ]
}

xml_encode():

<?xml version="1.0" encoding="UTF-8"?>
<user>
  <id>123</id>
  <login>bafoed</login>
  <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
  <email>[email protected]</email>
  <active>1</active>
  <languages>
    <value>PHP</value>
    <value>Javascript</value>
    <value>C#</value>
  </languages>
</user>

Как видим, все работает даже со вложенными массивами.
Полный код, включая функцию + usage:

<?php
header("Content-Type: text/xml");
function xml_encode($data, $root = 'response', $version = '1.0', $encoding = 'UTF-8')
{
    function getXML($data, $writer)
    {
        foreach ($data as $key => $val) {
            if (is_numeric($key)) {
                $key = 'value';
            }
            if (is_array($val)) {
                $writer->startElement($key);
                getXML($val, $writer);
                $writer->endElement();
            } else {
                $writer->writeElement($key, $val);
            }
        }
    }
    $writer = new XMLWriter();
    $writer->openMemory();
    $writer->startDocument($version, $encoding);
    $writer->startElement($root);
    if (is_array($data)) {
        getXML($data, $writer);
    }
    $writer->endElement();
    return $writer->outputMemory();
}
 
 
 
$info = array(
    'id' => 123,
    'login' => 'bafoed',
    'password' => '5f4dcc3b5aa765d61d8327deb882cf99',
    'email' => '[email protected]',
    'active' => true,
    'languages' => array('PHP', 'Javascript', 'C#')
);
echo xml_encode($info, 'user');