установлено ли расширение DOM
<? // выводит информацию о настройках PHP phpinfo(); // отображает используемую версию // библиотеки libxml echo domxml_version(); ?> |
Пример 14.1. Проверка, установлено ли расширение DOM XML |
Закрыть окно |
<?xml version="1.0"?> <collection> <person id="10"> <name> <first>Nick</first> <last>Petrov</last> </name> <birth> <day>23</day> <month>12</month> <year>89</year> </birth> <email> nick@ngs.ru </email> </person> <person id="20"> <name> <first>Bob</first> <last>Ivanov</last> </name> <birth> <day>03</day> <month>05</month> <year>90</year> </birth> <email> bob@ngs.ru </email> </person> </collection> |
Пример 14.2. Коллекция «Личности» в виде XML-файла (persons.xml) |
Закрыть окно |
<? //считываем файл "persons.xml" в строку $xmlstr = join('',file('persons.xml')); // переводим строку с xml-файлом // в дерево объектов. Если операция // прошла неудачно, то выводим // ошибку и прекращаем работу. if(!$dom = domxml_open_mem($xmlstr)) { echo "Ошибка при разборе документа\n"; exit; } // можно посмотреть, как выглядит // этот объект print_r($dom); echo "<hr>"; // выделяем корневой элемент // дерева объектов. // В нашем случае это будет // элемент <collection> $root = $dom->document_element(); print_r($root); echo "<hr>"; ?> |
Пример 14.3. Перевод XML-файла в дерево объектов PHP и выделение корневого элемента |
Закрыть окно |
<? // сначала делаем то же, // что и в предыдущем примере $xmlstr = join('',file('persons.xml')); if(!$dom = domxml_open_mem($xmlstr)) { echo "Ошибка при разборе документа\n"; exit; } $root = $dom->document_element(); // Получаем массив потомков // родительского узла // ( в нашем случае это массив <person>) $nodes = $root->child_nodes(); print_r($nodes); echo "<hr>"; // Начинаем обработку каждого // узла в массиве foreach($nodes as $node){ // Если текущий узел – один // из узлов <person>, то // продолжаем ее обработку, // чтобы получить информацию // об этой личности if ($node->tagname=='person'){ // Создаем массив, куда // будем собирать информацию // о рассматриваемой личности $currentPers = array(); // Получаем id личности, // который хранится в атрибуте 'id' $currentPers['id'] = $node->get_attribute('id'); // Получаем массив потомков // <person>. Это вся // информация о личности // (<name>,<birth> и т.д.) $persons_info = $node->child_nodes(); // Перебираем все дочерние // узлы $node foreach ($persons_info as $info){ // проверяем, является ли узел // элементом (xml-тегом) if ($info->type== XML_ELEMENT_NODE) { // тогда метод tagname // возвратит имя этого // элемента (тега), а метод // get_content() – // его содержимое $currentPers[$info->tagname] = $info->get_content(); } } // выводим на экран полученные // массивы print_r ($currentPers); echo "<br>"; } } ?> |
Пример 14.4. Обход дерева XML |
Закрыть окно |
// Для того чтобы добавить описание // новой личности, нужно знать, // как описывается каждая личность. // Выбираем элемент 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. Добавление описания новой личности в каталог |
Закрыть окно |