Добавление новых элементов в XML-документ

Далее разберем задачу, как можно добавить в нашу базу данных новую личность средствами php.

Сначала нужно скопировать описание личности (считаем, что все личности описываются с помощью стандартного набора характеристик, как в файле persons.xml ). Это делается с помощью метода DomNode->clone_node() . Таким образом, мы клонируем элемент <person> и все его внутренние элементы (содержание тегов не копируется).

Потом можно установить какие-нибудь значения для элементов описания личности. Например, задать имя человека, дату его рождения и т.п. В конце нужно записать полученное описание личности в качестве потомка корневого элемента в дерево DOM с помощью метода DomNode->append_child(new_node) , где в качестве параметра передается созданный объект (новый узел).

В PHP до версии 4.3 перед добавлением потомка к узлу с помощью данной функции этот потомок сначала копировался. Таким образом, новый узел являлся новой копией, которая могла изменяться без изменения узла, переданного как параметр в эту функцию. В более поздних версиях PHP новый узел удаляется из существующего контекста, если он уже есть в дереве. Такое поведение соответствует спецификациям W3C.

Для удаления узла можно воспользоваться методом, применив его к узлу, который требуется удалить, т.е. DomNode->unlink_node() .

// Для того чтобы добавить описание

// новой личности, нужно знать,

// как описывается каждая личность.

// Выбираем элемент person,

// который содержит описание личности

$elements = $dom->get_elements_by_tagname("person");

$element = $elements[0];

//вычисляем родителя и потомков

$parent = $element->parent_node();

$children = $element->child_nodes();

// клонируем элемент person

$person = $element->clone_node();

// устанавливаем новой

// личности идентификатор

$attr = $person->set_attribute("id", "30");

// если у личности были потомки,

// то их тоже надо клонировать

foreach ($children as $child){

//клонируем ребенка

$node = $child->clone_node();

//получаем массив внуков

$grand_children = $child->child_nodes();

// если ребенок имеет потомков,

//т.е. массив внуков не пуст, то

if (count($grand_children)<>1){

//клонируем каждого внука

//и присоединяем к уже

//клонированному ребенку

foreach($grand_children as $grand_child){

$lastnode = $grand_child->clone_node();

//записываем в нужные теги

//подходящие значения

if ($grand_child->tagname=="first")

$cont = $lastnode->set_content("Nina");

if ($grand_child->tagname=="last")

$cont = $lastnode->set_content("Saveljeva");

if ($grand_child->tagname=="day")

$cont = $lastnode->set_content("7");

if ($grand_child->tagname=="month")

$cont = $lastnode->set_content("06");

if ($grand_child->tagname=="year")

$cont = $lastnode->set_content("1981");

$newlastnode = $node->append_child($lastnode);

}

}

if ($child->tagname=="email") {

$cont = $node->set_content("help@intuit.ru");

}

$newnode2 = $person->append_child($node);

}

$newnode = $parent->append_child($person);

//dump_mem создает XML-документ из dom

//представления

echo "<PRE>";

$xmlfile = $dom->dump_mem(true);

// посмотрим в браузере,

// что получилось

echo htmlentities($xmlfile);

echo "</PRE>";

// запишем полученный XML-файл

// в файл "test.xml"

$h = fopen("test.xml","a");

if (!fwrite($h, $xmlfile)) {

print "Cannot write " . "to file ($filename)";

exit;

}

}

Пример 14.5. Добавление описания новой личности в каталог

Заключение

Итак, мы изучили ряд функций, позволяющих манипулировать данными, хранящимися в XML -формате. Это, конечно же, далеко не полный перечень существующих функций. В версии PHP5 он значительно усовершенствован и в большей степени соответствует стандарту DOM. Тем не менее знание приведенных здесь основных функций может оказаться полезным при решении конкретных прикладных задач.