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

Поиск:

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


Шустрый
*


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

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



Код

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

$xml = new SimpleXMLElement($xml_str);
$xml = (array)$xml;
unserialize(serialize($xml));

Код

SimpleXMLElement Object
(
    [child1] => Hello!
    [child2] => SimpleXMLElement Object
        (
        )

)

Код

O:16:"SimpleXMLElement":2:{s:6:"child1";s:6:"Hello!";s:6:"child3";O:16:"SimpleXMLElement":0:{}}


Суть проблемы в том, что пустые узлы не рассериализовать. Натыкаемся на предупреждение:
Код

Warning: unserialize() [function.unserialize]: Node no longer exists


Одно решение я нашёл:
Код
<?php
$xml = (array)$xml;

foreach ($xml as &$node) {
   if ($node instanceof SimpleXMLElement) {
      $node = null;
   }
}


Но может есть что-то более изящное?
--------------------
mlib.com.ru
PM MAIL   Вверх
WolfON
Дата 5.9.2007, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нет - изящного выхода отсюда нету.

Может быть имеет смысл пересмотреть структуру xml, может-быть сделать child3 атрибутом, если он имеет какой-то смысл.
А если не имеет, то зачем его хранить? можно добавить когда потребуется.
PM MAIL ICQ   Вверх
Sergey89
Дата 5.9.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



WolfON, имеется уже готовый XML файл. Хочется всячески исключить правку самого файла, т.к. он находится в ZIP архиве.
--------------------
mlib.com.ru
PM MAIL   Вверх
WolfON
Дата 5.9.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тогда обойдитесь без сериализации а сохраняйте все в xml.
Что мешает?
PM MAIL ICQ   Вверх
Sergey89
Дата 5.9.2007, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



WolfON, этот XML файл разбирается скриптом и результат записывается в массив. Чтобы повторно не разбирать XML, сделано кэширование массива через серриализацию.
--------------------
mlib.com.ru
PM MAIL   Вверх
WolfON
Дата 5.9.2007, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну тогда остается только ваш первый вариант
PM MAIL ICQ   Вверх
Sergey89
Дата 5.9.2007, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пришла в голову ещё одна идея
Код

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

$xml = new SimpleXMLElement($xml_str);
$str = str_replace('O:16:"SimpleXMLElement":0:{}', 's:0:"";', serialize((array)$xml));

print_r(unserialize($str));

--------------------
mlib.com.ru
PM MAIL   Вверх
Diesel Draft
Дата 6.9.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

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



Я б написал класс, который создает точно такую структуру, а потом серелезирувал


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
Sergey89
Дата 6.9.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Diesel Draft, предлагаешь велосипед изобрести и написать программную реализацию SimpleXML? Хотя можно с наследованием от SimpleXML чё-нить замутить.
--------------------
mlib.com.ru
PM MAIL   Вверх
WolfON
Дата 6.9.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Уффф... я вот не понимаю - вам нужно уменьшение нагрузки или что?
Решение с циклом самое быстрое.
PM MAIL ICQ   Вверх
Diesel Draft
Дата 6.9.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

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



Sergey89, Насчет наследования. Я пишу объект который наследует SimpleXML. Но припустим на сервере нет SimpleXML тогда я заменяю класс, не меняя имени на другой. Этот класс умеет все то самое, но реализован на РНР


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
Sergey89
Дата 6.9.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(WolfON @  6.9.2007,  17:04 Найти цитируемый пост)
Уффф... я вот не понимаю - вам нужно уменьшение нагрузки или что?
Решение с циклом самое быстрое. 

Отвлекитесь от кэширования и всего прочего. Я сейчас поставил вопрос конкретно о проблеме серриализации SimpleXML объекта. Но вот решение c str_replace всёравно быстрее.

Цитата(Diesel Draft @  6.9.2007,  17:37 Найти цитируемый пост)
Sergey89, Насчет наследования. Я пишу объект который наследует SimpleXML. Но припустим на сервере нет SimpleXML тогда я заменяю класс, не меняя имени на другой. Этот класс умеет все то самое, но реализован на РНР 

Хостинг без поддержки SimpleXML - недохостинг. PHP 4 сдыхает, а на PHP 5 перешёл любой дорожащий клиентами хостер. Но это так... лирическое отступление.
--------------------
mlib.com.ru
PM MAIL   Вверх
WolfON
Дата 6.9.2007, 19:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Хостинг без поддержки SimpleXML - недохостинг. PHP 4 сдыхает, а на PHP 5 перешёл любой дорожащий клиентами хостер. Но это так... лирическое отступление.

XML у которого имеют смысл пустые элементы - недоxml smile
ну честно - грамотное использование технологии решит проблему сейчас и не возникнет много проблем в дальнейшем.
PM MAIL ICQ   Вверх
Sergey89
Дата 6.9.2007, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



WolfON, ну не совсем. Логично, конечно, будет писать <child2 />, но <child2></child2> также имеет право на жизнь.
--------------------
mlib.com.ru
PM MAIL   Вверх
Diesel Draft
Дата 7.9.2007, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

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



Sergey89, что тема уже решена?


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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