Интернет-Университет Информационных Технологий: бесплатное дистанционное образование компьютерным дисциплинам
  Лекции
Язык программирования PHP
1.   Введение в PHP
2.   Основы синтаксиса
3.   Управляющие конструкции
4.   Обработка запросов с помощью PHP
5.   Функции в PHP
6.   Объекты и классы в PHP
7.   Работа с массивами данных
8.   Работа со строками
9.   Работа с файловой системой
10.   Базы данных и СУБД. Введение в S...
11.   Взаимодействие PHP и MySQL
12.   Авторизация доступа с помощью се...
13.   Регулярные выражения
14.   Взаимодействие PHP и XML
15.   Использование шаблонов в PHP
    Экзамен
    Сдать экзамен экстерном
    Литература
    Предметный указатель
    Примеры

Язык программирования PHP
14. Лекция: Взаимодействие PHP и XML
Страницы: « | 1 | 2 | 3 | 4 | 5 | вопросы | » | учебники | для печати и PDA
  Если Вы заметили ошибку - сообщите нам.  

Обход дерева объектов

Для получения значения текущего узла (вне зависимости от его типа) используют метод DomNode->node_value() или DomNode->get_content() для получения содержимого узла.

Для получения значения атрибута используется метод DomElement->get_attribute (attr_name). А метод DomNode->child_nodes() возвращает массив потомков данного узла.

Для того чтобы сделать обход дерева объектов, полезно еще уметь различать объекты по типам, т.е. определять, является ли узел элементом (тегом), текстом, атрибутом и т.п. Для этого используются специальные константы. XML_ELEMENT_NODE определяет, является ли узел элементом, XML_ATTRIBUTE_NODE определяет, является ли узел атрибутом, и XML_TEXT_NODE определяет, является ли узел куском текста. Эти константы имеют целочисленные значения 1, 2 и 3 соответственно. Использование этих констант полезно, поскольку переводы строки, применяемые для удобочитаемости XML-файлов, тоже становятся узлами.

<?
// сначала делаем то же,
// что и в предыдущем примере
$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 (html, txt)

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

...
<person id="20">
  <name>
    <first>Иван</first>
    <last>Иванов</last>
  </name>
...

Тогда в наш предыдущий пример вставим (после вывода на экран полученных массивов) строчку для поиска электронного адреса Ивана Иванова.

...
    $str = $currentPers["email"];
    if ($currentPers["name"] ==
                    "Иван Иванов" )
        echo "Здравствуйте, Иван! " .
        "Ваш e-mail $str";
...

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

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

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

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

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

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

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

Заключение

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

Перейти к вопросам »
  Если Вы заметили ошибку - сообщите нам.  
Страницы: « | 1 | 2 | 3 | 4 | 5 | вопросы | » | учебники | для печати и PDA
Курсы | Учебные программы | Учебники | Новости | Форум | Помощь

Телефон: (495) 253-9312, 253-9313, факс: (495) 253-9310, email: info@intuit.ru
© 2003-2006, INTUIT.ru::Интернет-Университет Информационных Технологий - дистанционное образование