Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

PHP Associative Array To DOMDocument (y0prst)
Author Message
y0prst
Участник форума



Joined: 20 May 2004
Posts: 101
Карма: 9
   поощрить/наказать

Location: Вологда

PostPosted: Fri Mar 24, 2006 10:42 am (написано за 5 минут 20 секунд)
   Post subject: PHP Associative Array To DOMDocument
Reply with quote

Добрый день.

Требуется некоторую информацию из БД представить в виде множества xml-документов. У этих документов много общих частей, поэтому генерировать каждый из них "с нуля" с использованием только DOM-функций получится довольно муторно. Требуется некий промежуточный вид для представления "частей" (элементов) документов, которые потом можно вставить в нужный документ. В качестве промежуточного кода идеально подходят ассоциативные массивы PHP. То есть: документом в этом случае является одноэлементный многомерный массив. Скалярные значения в этом массиве означают аттрибуты вышестоящего элемента, массивы -- элементы.

Собственно вопрос: существует ли готовое решение, создающее DOMDocument из ассоциативного массива PHP?
Back to top
View user's profile Send private message
y0prst
Участник форума



Joined: 20 May 2004
Posts: 101
Карма: 9
   поощрить/наказать

Location: Вологда

PostPosted: Fri Mar 24, 2006 11:42 am (спустя 59 минут; написано за 51 секунду)
   Post subject:
Reply with quote

Не всё так просто оказывается. В XML ведь имена элементов могут совпадать.
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Fri Mar 24, 2006 11:54 am (спустя 11 минут; написано за 1 минуту 7 секунд)
   Post subject:
Reply with quote

y0prst
Я решал такую задачу, но позже - отказался.
Удобнее сразу написать преобразование серии результатов к DOM, чем развлекаться с созданием промежуточного массива.
Back to top
View user's profile Send private message
chin
Участник форума



Joined: 23 Feb 2005
Posts: 312
Карма: 26
   поощрить/наказать

Location: Украина, Киев

PostPosted: Fri Mar 24, 2006 12:52 pm (спустя 57 минут; написано за 2 минуты 31 секунду)
   Post subject:
Reply with quote

WingedFox wrote:
Я решал такую задачу, но позже - отказался.
Аналогично (:
WingedFox wrote:
Удобнее сразу написать преобразование серии результатов к DOM, чем развлекаться с созданием промежуточного массива.
Или просто построить xml документ вручную, через цикл перебирая php массив:
Code (php): скопировать код в буфер обмена
echo (www.php.net/echo) "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n";
echo (www.php.net/echo) "<data>\r\n\r\n";
foreach($data as $id => $rdata) {
    echo (www.php.net/echo) "\t<block>\r\n";
    echo (www.php.net/echo) "\t\t<id>$id</id>\r\n";
    echo (www.php.net/echo) "\t\t<content>\r\n";
    foreach($rdata as $tagName => $tagContent) {
        echo (www.php.net/echo) "\t\t\t<tag name=\"$tagName\">$tagContent</text>\r\n";
    }
    echo (www.php.net/echo) "\t\t</content>\r\n";
    echo (www.php.net/echo) "\t</block>\r\n";
}
echo (www.php.net/echo) "</data>";
Ну это только пример. Сделать можно ведь по разному. Но когда я долбался с подобной задачей, то пришел к выводу, что проще всего сделать именно так (но это при условии, что нам извесна структура php массива).
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Fri Mar 24, 2006 1:50 pm (спустя 58 минут; написано за 49 секунд)
   Post subject:
Reply with quote

chin
Второй вариант плох тем, что потом для работы потребуется ещё и парсить этот XML.
Т.ч. DOM здесь много удобнее.
Back to top
View user's profile Send private message
y0prst
Участник форума



Joined: 20 May 2004
Posts: 101
Карма: 9
   поощрить/наказать

Location: Вологда

PostPosted: Fri Mar 24, 2006 2:06 pm (спустя 15 минут; написано за 3 минуты 37 секунд)
   Post subject:
Reply with quote

Ну я тоже представлю решение "на коленке" :)
Code (php): скопировать код в буфер обмена
<?php

class DOM_FromAssoc extends DOMDocument
{
        function __construct($assoc, $version='1.0', $encoding='iso-8859-1')
        {
                parent::__construct($version, $encoding);
                $this->importAssoc($assoc, $this);
        }

        function __destruct()
        {
                parent::__destruct();
        }

        function importAssoc($assoc, $parentNode)
        {
                foreach ($assoc as $key=>$value) {
                        if (is_array (www.php.net/is_array)($value)) {
                                $this->importAssoc($value, $parentNode->appendChild($this->createElement($key)));
                        }
                        else {
                                $parentNode->setAttribute($key, $value);
                        }
                }
        }
}

?>
Пример использования:
Code (php): скопировать код в буфер обмена
<?php

include_once "./lib/config.php";
include_once "DOM/FromAssoc.php";

$data = array (www.php.net/array) (
        'News' => array (www.php.net/array) (
                'count' => '2',
                'Item1' => array (www.php.net/array) (
                        'date' => '2006-03-24',
                        'text' => 'first',
                ),
                'Item2' => array (www.php.net/array) (
                        'date' => '2006-03-24',
                        'text' => 'first',
                ),
        ),
);

$doc = new DOM_FromAssoc($data);
$doc->formatOutput = true;
print (www.php.net/print) '<pre>'.htmlspecialchars($doc->saveXML()).'</pre>';

?>
Вывод скрипта:
Code (any language): скопировать код в буфер обмена
<?xml version="1.0" encoding="iso-8859-1"?>
<News count="2">
  <Item1 date="2006-03-24" text="first"/>
  <Item2 date="2006-03-24" text="first"/>
</News>
Минус:
В таком виде невозможно представить одноименные элементы. Например, получить такую структуру:
Code (any language): скопировать код в буфер обмена
<News count="2">
  <Item date="2006-03-24" text="first"/>
  <Item date="2006-03-24" text="first"/>
</News>
Возможное решение - помещать все элементы в элемент массива с индексом, который не может быть именем элемента в XML.
Например "<>".
Back to top
View user's profile Send private message
y0prst
Участник форума



Joined: 20 May 2004
Posts: 101
Карма: 9
   поощрить/наказать

Location: Вологда

PostPosted: Fri Mar 24, 2006 2:09 pm (спустя 3 минуты; написано за 11 секунд)
   Post subject:
Reply with quote

y0prst wrote:
который не может быть именем элемента в XML
Поправочка: именем аттрибута.
Back to top
View user's profile Send private message
y0prst
Участник форума



Joined: 20 May 2004
Posts: 101
Карма: 9
   поощрить/наказать

Location: Вологда

PostPosted: Fri Mar 24, 2006 2:54 pm (спустя 44 минуты; написано за 2 минуты 11 секунд)
   Post subject:
Reply with quote

y0prst wrote:
Возможное решение - помещать все элементы в элемент массива с индексом....
Всё-таки, какой бред :/ Названия элементов все равно одинаковыми останутся, а такое в php написать низзя.

PS. Всё сделал через DOM, всё заработало :)
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Fri Mar 24, 2006 3:09 pm (спустя 15 минут; написано за 3 минуты 51 секунду)
   Post subject:
Reply with quote

Ну почему же - бред
У меня вполне работала такая структура:
Code (php): скопировать код в буфер обмена
array (www.php.net/array) ( 'node' => array (www.php.net/array) ( 'attr1' => 'val1',
                          'attr2' => 'val2',
                          'child' => array (www.php.net/array) ( array (www.php.net/array) ( 'attr3' => 'val3'),
                                             array (www.php.net/array) ( 'attr4' => 'val4')
                                           ),
                          'item' => array (www.php.net/array) ( array (www.php.net/array) ( 'attr5' => 'val5'),
                                            array (www.php.net/array) ( 'attr6' => 'val6')
                                           )
                        )
      )
Соотв. элементы с цифровыми индексами получали имена "атрибута".
Back to top
View user's profile Send private message
y0prst
Участник форума



Joined: 20 May 2004
Posts: 101
Карма: 9
   поощрить/наказать

Location: Вологда

PostPosted: Fri Mar 24, 2006 3:25 pm (спустя 15 минут; написано за 2 минуты 28 секунд)
   Post subject:
Reply with quote

WingedFox wrote:
Соотв. элементы с цифровыми индексами получали имена "атрибута".
1. Какого аттрибута? Ведь может быть несколько.
2. Какой код XML получится в приведенном Вами случае? Просто не совсем понимаю, что куда встанет.
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Fri Mar 24, 2006 3:29 pm (спустя 3 минуты; написано за 2 минуты 9 секунд)
   Post subject:
Reply with quote

В результате получается:
Code (any language): скопировать код в буфер обмена
<node attr1="val1" attr2="val2">
  <child attr3="val3" />
  <child attr4="val4" />
  <item attr5="val5" />
  <item attr6="val5" />
</node>
Но, всё равно - сильно криво. 8*)
Back to top
View user's profile Send private message
chin
Участник форума



Joined: 23 Feb 2005
Posts: 312
Карма: 26
   поощрить/наказать

Location: Украина, Киев

PostPosted: Sat Mar 25, 2006 12:44 pm (спустя 21 час 15 минут; написано за 29 секунд)
   Post subject:
Reply with quote

WingedFox wrote:
Второй вариант плох тем, что потом для работы потребуется ещё и парсить этот XML.
Т.ч. DOM здесь много удобнее.
ну я же не говорил, что второй вариант - не извращение... (:
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML