Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SimpleXML, серриализация 
V
    Опции темы
Sergey89
Дата 7.9.2007, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 14.9.2004

Репутация: нет
Всего: нет



Код

<?php
$str = <<<XML
<?xml version="1.0"?>
<root>
    <child1>Hello</child1>
    <child2></child2>
    <child3 />
    <child4>
        <child5></child5>
        <child6>World!</child6>
        <child7><child8 /></child7>
    </child4>
</root>
XML;

function xmlToArray($xml) {
    $xml = (array)$xml;

    foreach ($xml as &$v) {
        if (count($v) && ($v instanceof SimpleXMLElement)) {
            $v = xmlToArray((array)$v);
        } elseif ($v instanceof SimpleXMLElement) {
            $v = null;
        }
    }

    return $xml;
}

$xml = new SimpleXMLElement($str);
print_r(xmlToArray($xml));

С наследованием от SimpleXMLElemtnt ничего не вышло, т.к. конструктор базового класса объявлен как final.

ЗЫ мне кажется, или heredoc ситнаксис действительно не воспринимается как строка? Это я про подсветку кода.

Это сообщение отредактировал(а) Sergey89 - 7.9.2007, 23:15
--------------------
mlib.com.ru
PM MAIL   Вверх
WolfON
Дата 7.9.2007, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 1
Всего: 8



кажется - heredoc это по сути обычный комментарий
PM MAIL ICQ   Вверх
Sergey89
Дата 7.9.2007, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 14.9.2004

Репутация: нет
Всего: нет



Нет. Это именно один из способов определения строки. http://php.net/heredoc
--------------------
mlib.com.ru
PM MAIL   Вверх
WolfON
Дата 7.9.2007, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 1
Всего: 8



черт попутал с phpdoc %)
PM MAIL ICQ   Вверх
Endeveit
Дата 8.9.2007, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 2.6.2006

Репутация: 1
Всего: 7



ПХП не поддерживает десериализацию объектов DOM, SimpleXML и некоторых других (подробнее где-то на bugs.php.net)
В принципе возможно вот такое решение:
Код

<?php
class mySimpleXMLElement implements Serializable
{
    private $obj_instance = null;
    private $xml_instance = '';

    public function __construct($data)
    {
        $this->obj_instance = simplexml_load_string($data);
    }

    public function getInstance()
    {
        return $this->obj_instance;
    }

    public function serialize()
    {
        $this->xml_instance = $this->obj_instance->asXML();
        unset($this->obj_instance);
        return serialize($this->xml_instance);
    }

    public function unserialize($serialized)
    {
        $this->obj_instance = simplexml_load_string(unserialize($serialized));
    }
}

$xml_str = <<<XML
<?xml version="1.0"?>
 <parent>
  <child1>Hello!</child1>
  <child2></child2>
  <child3 />
</parent>
XML;

$xml = new mySimpleXMLElement($xml_str);
$child = $xml->getInstance()->addChild('child4');
$child->addChild('child4_1', 'Whoa!');
$child->addChild('child4_2', 'It works!');

$s_xml = serialize($xml);
var_dump($s_xml);
$o_xml = unserialize($s_xml);
var_dump($o_xml);

PM WWW   Вверх
Sergey89
Дата 8.9.2007, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 14.9.2004

Репутация: нет
Всего: нет



Endeveit, проблема немного в другом. Необходимо привести объект типа SimpleXMLElement к типу array и серриализовать именно массив. За код конечно спасибо, сохраню для себя его.
--------------------
mlib.com.ru
PM MAIL   Вверх
Endeveit
Дата 8.9.2007, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 2.6.2006

Репутация: 1
Всего: 7



Как я уже написал выше, ПХП в любом случае не поддерживает десериализацию объектов DOM, SimpleXML.
P.S. Если честно, не совсем понятна идея с сериализацией именно массива, мое предыдущее решение много лучше и красивее, имхо.

Это сообщение отредактировал(а) Endeveit - 8.9.2007, 22:21
PM WWW   Вверх
Endeveit
Дата 8.9.2007, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 2.6.2006

Репутация: 1
Всего: 7



Но есть еще решение - руками вызывать метод, который будет приводит объект к массиву нужного вида и руками же делать обратное преобразование.
Как-то так, например:
Код

<?php
class mySimpleXMLElement extends SimpleXMLElement
{
    public function toArray()
    {
        $vars = get_object_vars($this);
        foreach ($vars as $k => $v) {
            if (empty($v)) {
                unset($vars[$k]);
            }
        }
        return $vars;
    }
}

function array_to_mySimpleXMLElement($array)
{
    // тут код, который будет создавать новый объект
    // затем проходить по всем элементам массива $array
    // и добавлять их к объекту
}

$xml_str = <<<XML
<?xml version="1.0"?>
 <parent>
  <child1>Hello!</child1>
  <child2></child2>
  <child3 />
</parent>
XML;

$xml = new mySimpleXMLElement($xml_str);

$s_xml = serialize($xml->toArray());
$o_xml = array_to_mySimpleXMLElement(unserialize($s_xml));


PM WWW   Вверх
Sergey89
Дата 8.9.2007, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 14.9.2004

Репутация: нет
Всего: нет



А это тоже самое что я уже написал. Только в виде отдельной функции.

Это сообщение отредактировал(а) Sergey89 - 8.9.2007, 22:41
--------------------
mlib.com.ru
PM MAIL   Вверх
Endeveit
Дата 8.9.2007, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 2.6.2006

Репутация: 1
Всего: 7



Ну, тогда только такое решение.
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0984 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.