| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Для профи > SimpleXML, серриализация |
| Автор: Sergey89 5.9.2007, 18:47 | ||||||||||
Суть проблемы в том, что пустые узлы не рассериализовать. Натыкаемся на предупреждение:
Одно решение я нашёл:
Но может есть что-то более изящное? |
| Автор: WolfON 5.9.2007, 18:58 |
| Нет - изящного выхода отсюда нету. Может быть имеет смысл пересмотреть структуру xml, может-быть сделать child3 атрибутом, если он имеет какой-то смысл. А если не имеет, то зачем его хранить? можно добавить когда потребуется. |
| Автор: Sergey89 5.9.2007, 19:00 |
| WolfON, имеется уже готовый XML файл. Хочется всячески исключить правку самого файла, т.к. он находится в ZIP архиве. |
| Автор: WolfON 5.9.2007, 19:02 |
| Тогда обойдитесь без сериализации а сохраняйте все в xml. Что мешает? |
| Автор: Sergey89 5.9.2007, 19:09 |
| WolfON, этот XML файл разбирается скриптом и результат записывается в массив. Чтобы повторно не разбирать XML, сделано кэширование массива через серриализацию. |
| Автор: WolfON 5.9.2007, 19:14 |
| ну тогда остается только ваш первый вариант |
| Автор: Sergey89 5.9.2007, 19:24 | ||
Пришла в голову ещё одна идея
|
| Автор: Diesel Draft 6.9.2007, 10:34 |
| Я б написал класс, который создает точно такую структуру, а потом серелезирувал |
| Автор: Sergey89 6.9.2007, 16:59 |
| Diesel Draft, предлагаешь велосипед изобрести и написать программную реализацию SimpleXML? Хотя можно с наследованием от SimpleXML чё-нить замутить. |
| Автор: WolfON 6.9.2007, 17:04 |
| Уффф... я вот не понимаю - вам нужно уменьшение нагрузки или что? Решение с циклом самое быстрое. |
| Автор: Diesel Draft 6.9.2007, 17:37 |
| Sergey89, Насчет наследования. Я пишу объект который наследует SimpleXML. Но припустим на сервере нет SimpleXML тогда я заменяю класс, не меняя имени на другой. Этот класс умеет все то самое, но реализован на РНР |
| Автор: WolfON 6.9.2007, 19:42 | ||
XML у которого имеют смысл пустые элементы - недоxml ну честно - грамотное использование технологии решит проблему сейчас и не возникнет много проблем в дальнейшем. |
| Автор: Sergey89 6.9.2007, 19:45 |
| WolfON, ну не совсем. Логично, конечно, будет писать <child2 />, но <child2></child2> также имеет право на жизнь. |
| Автор: Diesel Draft 7.9.2007, 10:13 |
| Sergey89, что тема уже решена? |
| Автор: Sergey89 7.9.2007, 22:56 | ||
С наследованием от SimpleXMLElemtnt ничего не вышло, т.к. конструктор базового класса объявлен как final. ЗЫ мне кажется, или heredoc ситнаксис действительно не воспринимается как строка? Это я про подсветку кода. |
| Автор: WolfON 7.9.2007, 23:16 |
| кажется - heredoc это по сути обычный комментарий |
| Автор: Sergey89 7.9.2007, 23:23 |
| Нет. Это именно один из способов определения строки. http://php.net/heredoc |
| Автор: WolfON 7.9.2007, 23:41 |
| черт попутал с phpdoc %) |
| Автор: Endeveit 8.9.2007, 20:38 | ||
| ПХП не поддерживает десериализацию объектов DOM, SimpleXML и некоторых других (подробнее где-то на bugs.php.net) В принципе возможно вот такое решение:
|
| Автор: Sergey89 8.9.2007, 21:23 |
| Endeveit, проблема немного в другом. Необходимо привести объект типа SimpleXMLElement к типу array и серриализовать именно массив. За код конечно спасибо, сохраню для себя его. |
| Автор: Endeveit 8.9.2007, 22:05 |
| Как я уже написал выше, ПХП в любом случае не поддерживает десериализацию объектов DOM, SimpleXML. P.S. Если честно, не совсем понятна идея с сериализацией именно массива, мое предыдущее решение много лучше и красивее, имхо. |
| Автор: Endeveit 8.9.2007, 22:30 | ||
| Но есть еще решение - руками вызывать метод, который будет приводит объект к массиву нужного вида и руками же делать обратное преобразование. Как-то так, например:
|
| Автор: Sergey89 8.9.2007, 22:36 |
| А это тоже самое что я уже написал. Только в виде отдельной функции. |
| Автор: Endeveit 8.9.2007, 22:44 |
| Ну, тогда только http://forum.vingrad.ru/index.php?showtopic=171212&view=findpost&p=1250299 решение. |