Эта глава посвящена функциям, работающим с XML-документами. С момента своего появления в 1996 году расширенный язык XML постепенно становится популярным. Кроме того, что язык XML является первым "родственником" языка HTML, он еще имеет отношение и к языку SGML, появившемуся примерно 20 лет тому назад. Подобно HTML-документам, в XML-документах текстовые данные заключаются в теги. Но в отличие от языка HTML язык XML может работать с данными любого типа. Лучше всего начать изучение языка XML с домашней страницы корпорации W3C, расположенной по адресу <http://www.w3.org/XML/>. Там можно не только почерпнуть много полезной информации, но и найти отличную библиографию.
PHP предлагает два метода работы с XML-документами - с помощью DOM-модели и обработки событий. При использовании первого метода XML-документ является набором объектов. Во втором случае по мере прочтения XML-документов PHP выполняет указанные программы обработки. В этой главе также обсуждается язык WDDX, предназначенный для трансформации данных.
Приведенные в этой главе примеры относятся к XML-документу, показанному в листинге 20.1. В листинге 20.2 представлен его DTD. В листинге 20.3 продемонстрирован внешний непроанализированный объект. В листинге 20.4 вниманию читателя представлен простой XSL-документ.

| Листинг 20.1. Пример XML-документа_
<?xml version=,1.0'?>
<!DOCTYPE example SYSTEM "corephp.dtd" [
<!ENTITY externalEntity SYSTEM "corephp_entity.xml">
<!ENTITY capture SYSTEM
"http://www.php.net/gifs/php_logo.gif" NDATA gif>
<!NOTATION gif SYSTEM "/usr/local/bin/view_gif">
]>
<example output="capture"
xmlns:xhtml="http://www.w3.org/19 99/xhtml"> <title>An Example XML Document</title> <code> 
This section contains some PHP code. <?phpphp
print("Core PHP");
?>
<xhtml:br /> </code>
&externalEntity;
<table border="yes">
<row><cell>A</cell><cell>D</cell></row> <row><cell>B</cell><cell>E</cell></row> <row><cell>C</cell><cell>F</cell></row>
</table> </example>

Листинг 20.2. Пример DTD

<!ELEMENT example (title,code,table*)> <!ATTLIST example output CDATA #IMPLIED> <!ELEMENT title (#PCDATA)> <!ELEMENT code (#PCDATA)> <!ELEMENT table (row*)>
<!ATTLIST table border CDATA #REQUIRED> <!ELEMENT row (cell*)> <!ELEMENT cell (#PCDATA)>

Листинг 20.3. Пример внешнего объекта

<?xml version="1.0" ?> This is the external entity.

Листинг 20.4. Пример XSL-документа

<xsl:stylesheet version="1.0"
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="/">
<h1><xsl:value-of select="//title"/></h1>
<pre>
<xsl:value-of select="//code"/> </pre>
<xsl:value-of select="$myParam" /> </xsl:template> </xsl:stylesheet> 
20.1. DOM-модель
Объектная модель документа (Document Object Model, DOM) представляет собой интерфейс, позволяющий программам читать и обновлять отдельные элементы XML-документа. Каждый элемент документа представляется в виде объекта с методами и атрибутами, которым может манипулировать программа. Одним из самых популярных примеров применения DOM-модели является обновляющий в браузерах HTML-страницы язык JavaScript. С точки зрения PHP DOM-модель предоставляет естественный способ обработки XML-документов как обычной структуры данных. Достаточно сравнить такой подход с подходом, используемым XML-функциями библиотеки Expat, о которых речь пойдет ниже.
Для того чтобы работать с функциями, описанными в этом разделе, PHP работает с библиотекой GNOME XML (<http://www.xmlsoft.org/>). Последнее его описание можно найти на Web-узле компании W3C по адресу <http://www.w3.org/DOM/>. Подробное описание всех аспектов DOM-модели выходит за рамками данной книги, но информации, представленной в этой главе, вполне достаточно для начала. Кроме того, советую прочитать книгу Джо Марини (Joe Marini) Document Object Model: Processing Structured Documents.
Для отображения классов, описанных спецификацией DOM-модели, PHP создает несколько своих собственных классов. Для того чтобы не нарушить целостность пространства имен, эти классы PHP имеют префикс Dom. Например, классу node из спецификации в PHP соответствует класс DomNode. Классы PHP реализуют как атрибуты, так и методы, определенные спецификацией в качестве методов. Имена методов PHP соответствуют соглашению относительно функций PHP, в которых, кроме всего прочего, оговорено использование символа подчеркивания для разделения слов. Там, где в спецификации речь идет о свойстве ownerDocument класса node, PHP на классе DomNode реализует метод owner_document.
Некоторые из описанных ниже методов на момент написания книги еще не были реализованы в полной мере. Однако, из-за того что они присутствуют в исходном коде и спецификации DOM-модели, они, скорее всего, очень скоро заработают.
string DomAttribute::name()
Метод name (листинг 20.5) возвращает имя атрибута.

| Листинг 20.5. Методы DomAttribute::name, DomAttribute::value
<?php
//загрузить документ
$dom = domxml_open_file("corephp.xml"); //выбрать первый элемент в таблице
list($table) = $dom->get_elements_by_tagname('table'); //получить первый атрибут list($a) = $table->attributes(); print("Атрибут " . $a->name() . " равен " . $a->value());
?> 
boolean DomAttribute::specified()
Если XML-документ специфицирует значение этого атрибута, метод возвращает значение TRUE. Если атрибут не связан, этот метод возвращает значение FALSE.
string DomAttribute::value()
Метод value возвращает значение атрибута.
object DomDocument::create_attribute(string name, string value)
Метод create_attribute возвращает объект DomAttribute с заданными именем и значением.
object DomDocument::create_cdata_section(string cdata)
Метод create_cdata_section возвращает объект DomCData.
object DomDocument::create_comment(string comment)
Метод create_comment возвращает объект DomComment.
object DomDocument::create_element(string name)
Метод create_element возвращает объект DomElement.