Чтение онлайн

на главную - закладки

Жанры

Курс "Язык программирования PHP"

Савельева Нина Владимировна

Шрифт:

// В нашем случае это будет

// элемент <collection>

$root = $dom->document_element;

print_r($root);

echo "<hr>";

?>

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

Обход

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

Для получения значения текущего узла (вне зависимости от его типа) используют метод 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>";

}

}

?>

Итак, мы научились обходить дерево 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> и все его внутренние элементы (содержание тегов не копируется).

Поделиться:
Популярные книги

Черный маг императора 3

Герда Александр
3. Черный маг императора
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора 3

Двойник короля 18

Скабер Артемий
18. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 18

Последний Паладин. Том 13

Саваровский Роман
13. Путь Паладина
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 13

Проклятый Лекарь

Молотов Виктор
1. Анатомия Тьмы
Фантастика:
фэнтези
5.00
рейтинг книги
Проклятый Лекарь

Боярышня Евдокия

Меллер Юлия Викторовна
3. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Евдокия

Последний Герой. Том 1

Дамиров Рафаэль
1. Последний герой
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
5.00
рейтинг книги
Последний Герой. Том 1

Белый Волк

Мазин Александр Владимирович
2. Викинг
Приключения:
исторические приключения
9.12
рейтинг книги
Белый Волк

Обрыв

Гончаров Иван Александрович
Проза:
классическая проза
русская классическая проза
8.93
рейтинг книги
Обрыв

Князь Андер Арес 3

Грехов Тимофей
3. Андер Арес
Фантастика:
рпг
аниме
фэнтези
5.00
рейтинг книги
Князь Андер Арес 3

Геном хищника. Книга седьмая

Гарцевич Евгений Александрович
7. Я - Легенда!
Фантастика:
боевая фантастика
рпг
фэнтези
попаданцы
5.00
рейтинг книги
Геном хищника. Книга седьмая

Неучтенный элемент. Том 10

NikL
10. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 10

Черный Маг Императора 11

Герда Александр
11. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Черный Маг Императора 11

Проводник

Кораблев Родион
2. Другая сторона
Фантастика:
боевая фантастика
рпг
7.41
рейтинг книги
Проводник

Полигон

Гостева Ирина
S.T.A.L.K.E.R.
Фантастика:
боевая фантастика
7.78
рейтинг книги
Полигон