array 2 xml

HraKK

Мудак
Команда форума
array 2 xml

Какой-нибудь простой быстрый конвертатор, желательно с таким интерфейсом
$xml = new Array2xml($array);
 

korchasa

LIMB infected
Re: array 2 xml

Автор оригинала: HraKK
Какой-нибудь простой быстрый конвертатор, желательно с таким интерфейсом
$xml = new Array2xml($array);
PHP:
<?php
class DataConverter {
    static function array2Xml($array, $container = 'values')
    {
        if(!is_array($array)) {
            throw new Exception('Param must be a array');
        }
        $xml = '';
        foreach($array as $key => $value) {
            if(is_integer($key)) {
                $key = self::getEntityNameFromContainer($container);
            }
            $xml .= (is_array($value)) ? self::array2Xml($value, $key) : self::value2Xml($value, $key);
        }
        return self::value2Xml($xml,$container);
    }

    static function value2Xml($value, $container)
    {
        return '<'.$container.'>'.$value.'</'.$container.'>';
    }

    static function getEntityNameFromContainer($containerName, $default = 'entity')
    {
        if('s' == substr($containerName, -1)) {
            return substr($containerName, 0, strlen($containerName) - 1);
        }
        if(strlen($containerName < 3)) {
            return $default;
        }
        $ending = substr($containerName, -3);
        if('ses' == $ending || 'oes' == $ending || 'xes' == $ending) {
            return substr($containerName, 0, strlen($containerName) - 2);
        }
        if(strlen($containerName < 4)) {
            return $default;
        }
        $ending = substr($containerName, -4);
        if('shes' == $ending || 'ches' == $ending) {
            return substr($containerName, 0, strlen($containerName) - 2);
        }
        return $default;
    }
}

$arr = array(1, 'foos' => array(bar, 2));

echo DataConverter::array2xml($arr, 'childs');
Правда тесты на него потерялись :(
 

BRat

o_0
korchasa
это какой-то совсем простой, а если в $value будет что-нибудь типа "<b>a</b>" ?)
 

korchasa

LIMB infected
Автор оригинала: BRat
korchasa
это какой-то совсем простой, а если в $value будет что-нибудь типа "<b>a</b>" ?)
То мы меньше чем за минуту изменим метод value2xml, чтобы он делал то, что нужно ;)

Это чисто утилитарный класс, я его использовал, как заготовку под конкретные нужды.
 

HraKK

Мудак
Команда форума
Я заюзал DOM Element и написал уже сам побыстрячку)

-~{}~ 25.03.08 20:04:

Если кому надо это убожество:
PHP:
class array2xml
{
	protected $xml;
	public function __construct( $elements, $rootnode = 'rootnode' )
	{
		$this->xml =new DOMDocument('1.0','iso-8859-1');
		$rootElement=$this->xml->createElement($rootnode,'');
		$this->xml->appendChild($rootElement);
		$this->transform($rootElement, $elements);
	}

	protected function transform($currentNode, $elements)
	{
		if( is_array($elements))
		{
			foreach($elements as $key=>$value)
			{				
				if(is_array($value))
				{
					$element=$this->xml->createElement($key,'');				
					$currentNode->appendChild($element);	
					$this->transform($element, $value);
				}
				else 
				{
					$element=$this->xml->createElement($key,$value);				
					$currentNode->appendChild($element);	
				}
				
			}
		}
		else
		{
			return false;
		}
	}
	
	public function xml()
	{
		return $this->xml->saveXML();
	}
}
 

HraKK

Мудак
Команда форума
Не в строчках дело. Как я недавно написал алгоритм аналогичный функции strtr там тоже строчек 30, но многие кому даю такую задачу пишут уже 2 месяц))
 

Wicked

Новичок
потом захочется атрибуты, конвертировать в обратном направлении, нэймспэйсы, кодировки, схемы для валидации, ... :)
 

HraKK

Мудак
Команда форума
Угу лучше отсеивать =)
При этом один такой программист свято уверен что он лучше меня программирует ;D

-~{}~ 26.03.08 17:54:

Wicked
В обратном направлении - simpleXML.
Это нужно для универсализации обмена между сервером и клиентом.
 
Сверху