Как заставить работать DomDocument->get_element_by_id()
Предположим, что мы решили организовать какие-то данные на нашем сайте с помощью XML. В моем случае это была структура сайта.
Для начала придумаем элементы структуры, в моем примере это:
-
structure – корневой элемент структуры
-
section – описывает раздел сайта
-
option – описывает свойство раздела сайта
Иерархия элементов в файле structure.xml следующая:
<structure>
<section id="i1" name="О компании">
<option name="href" value="index.php"/>
<section id="i2" name="История">
<option name="href" value="index.php"/>
<option name="desc" value="История компании"/>
</section>
</section>
<section id="i3" name="Контакты">
<option name="href" value="contacts.php"/>
</section>
</structure>
Как видно из этого примера, элемент structure может содержать один или несколько элементов section, в свою очередь элемент section может содержать один или несколько элементов section и/или option.
Элемент section также содержит атрибут id который и планируется использовать для получения этого узла с помощью функции get_element_by_id. Внимание, значение аттрибута id не должно начинаться с цифры.
Чтобы PHP знал, что атрибут id и есть тот самый Айди, по которуму следует идентифицировать узел функции get_element_by_id. Нам необходимо составить документ DTD, в котором мы опишем все элементы и атрибуты, которые будем использовать в XML документе.
Для этого создадим файл structure.dtd, пускай он лежит в одной папке с XML документом.
И опишем в нем наши тэги, следующим образом:
-- Описываем элемент structure, который может содержать 0 или более элементов section --
<!ELEMENT structure (section)* >
-- Описываем элемент section, который может содержать 0 или более элементов option и/или section --
<!ELEMENT section (option | section)* >
-- Описываем аттрибуты элемента section --
<!ATTLIST section
id ID #REQUIRED -- эта строка является ключевой, для работы функции get_element_by_id --
name CDATA #REQUIRED
>
-- Описываем элемент option, который должен быть пустым --
<!ELEMENT option (#PCDATA)>
-- Описываем аттрибуты элемента option --
<!ATTLIST option
name CDATA #REQUIRED
value CDATA #REQUIRED
>
Теперь необходимо подключить это описание к нашему XML документу, делается это с помощью DOCTYPE вот так:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE structure SYSTEM "structure.dtd">
...
Внимание, имя DOCTYPE должно совпадать с именем корневого тэга.
Напомню, что в данном случае DTD и XML файлы должны лежать в одной папке.
Теперь PHP скрипт, который получит для нас элемент section с идентификатором "i2" и напечатет его атрибут name
<?
$dd = domxml_open_file(realpath('structure.xml'),DOMXML_LOAD_VALIDATING,$error);
$e = $dd->getElementById('i2');
print $e->getAttribute('name');
?>
