Программирование на PHP. Работа с XML. SAX, DOM - краткое введение.
В прошлой статье шла речь об использовании механизма темплейтов для генерации HTML кода страниц. Там же было упоминание о возможности использования XML-технологий для решения той же задачи. В этом выпуске мы начинаем рассматривать работу с XML - сначала в общем, а затем в части использования этих технологий для генерации динамических страниц.
Примечание: из-за того, что модули для работы с XML в PHP пока находятся в состоянии "экспериментальных" - примеры приведенные в статье могут не работать в некоторых версиях PHP из-за различий в наборе функций, реализуемых этими модулями. Примеры писались и тестировались на PHP 4.0.6.
Работа с XML-данными в PHP
Общая информация об XML
XML (eXtensible Markup Language, расширяемый язык разметки) - достаточно новая технология (первый вариант спецификации XML увидел свет в 1998-м году) и поэтому многим она либо незнакома, либо знакома лишь поверхностно. Но самое главное - как правило люди не видят способов применения XML в своей повседневной работе. Из-за этого многие люди, особенно не являющиеся профессиональными разработчиками (т.к. по последним опросам более половины профессоналов используют XML-технологии в своей работе) обходят стороной эту технологию стороной, пытаясь взамен разработать что-то свое.
Поэтому прежде, чем начать описание того, как работать с XML-данными в PHP и как использовать их в ваших программах, необходимо, хотя бы вкратце описать, что же такое XML. Хочу сразу предупредить вас, что подробное рассмотрение непосредственно XML-технологий выходит за рамки нашего повествования и всем, кто захочет узнать больше об XML как таковом - должен будет сделать это самостоятельно. В интернете есть огромное количество информации об XML, но начинать нужно с самого полного и правильного документа, касающегося XML - его спецификации (кстати, есть и русские переводы этой спецификации). Кроме того советую вам посетить сайт http://xmlhack.ru/ - там вы найдете множество интересной информации об XML на русском языке и ссылки на другие ресурсы сети, посвященных XML.
Итак, что же такое XML? Как уже было сказано ранее - это расширяемый язык разметки. Под термином "язык разметки" понимается любой язык, который позволяет определять назначение, свойства, способ отображения и т.п. частей документа путем добавления в текст документа "тегов" - специальных конструкций, распознаваемых парсером языка. Чтобы не запутать вас этим ужасным определением приведу простой и всем понятный пример - язык HTML, который является ничем иным как языком разметки (HTML - Hyper Text Markup Language, язык разметки гипертекстовых документов). Однако при всей своей мощи язык HTML является все-таки ограниченным, поскольку определяет фиксированный набор тегов, каждый из которых может использоваться лишь для одной, предназначенной ему цели, что, согласитесь, не подходит в качестве метода для решения любой задачи представления информации. Хотя использование CSS1 и особенно CSS2 отчасти позволяет расширить рамки этого языка по крайней мере в части его визуального отображения, но этот метод также имеет свои недостатки:
Возможность задания фактически любого визуального отображения для любого тега значительно осложняет работу программ, занимающихся анализом HTML документов. Например роботы поисковых машин в общем случае уже не могут утверждать, что тег <h1> имеет больший вес, чем тег <p> в данном конкретном документе, потому что используя CSS я могу добиться прямо противоположных результатов визуального отображения того же документа.
Реализация CSS (и особенно CSS2) в современных браузерах оставляет желать много лучшего. Наилучших результатов здесь добились авторы Gecko - движка для браузеров, на котором построены браузеры Netscape 6, Mozilla, Galeon и другие. Opera 6 тоже выглядит достаточно хорошо в плане поддержки стандартов CSS1 и CSS2, Internet Explorer на фоне их выглядит довольно бледно - у него наблюдаются явные проблемы с реализацией некоторых частей спецификации CSS2 (что, впрочем, неудивительно - ребята из Редмонда всегда отличались оригинальным взглядом на вопрос поддержки в своих программах спецификаций, в разработке которых они же сами и принимали непосредственное участие).
И помимо всего этого у HTML есть еще один огромный недостаток - используя этот язык можно описать, как должен выглядеть документ, но нельзя описать то, какая информация содержится в этом документе. Это порождает целую массу проблем. Одной из самых серьезных можно назвать проблему поиска информации, потому что те же поисковые машины вынуждены лишь делать предположения о том, что документ, который они нашли в той или иной мере соответствует запросу. Но как ни хороши алгоритмы работы современных поисковых машин - в результатах их работы все равно много "мусора".
Язык XML появился на свет во многом благодаря существованию описанных выше проблем, когда стало ясно, что необходим язык, настолько же простой и понятный как HTML, но способный хранить в себе любую информацию в структурированном виде, имеющий синтаксис, который бы позволил легко писать программы для работы с документами XML, имеющий встроенные средства проверки корректности структуры и информации, описанной в документе и другие параметры, облегчающие создание, обработку и использование данных, описанных в документах XML. Нужно сказать, что к моменту создания XML подобный язык уже существовал (это язык SGML - Standard Generalized Markup Language), но этот язык настолько сложен, что широкое использование его значительно затруднено. Надо сказать, что со своей задачей разработчики XML справились просто превосходно - спецификация языка XML 1.0 соответствует всем требованиям. Однако перейдем от слов к делу и посмотрим на пример XML-документа, например, описывающего книгу:
<book isbn="0395489326">
<author>John R. R. Tolkien</author>
<title>Lord of the rings</title>
<category>Fantasy</category>
<price currency="USD">9.95</price>
</book>
Как видите - содержимое этого документа говорит само за себя и даже человек, который впервые видит этот документ поймет что значат те или иные данные в нем. В этом и состоит основная прелесть XML - хорошо составленный XML документ содержит в себе информацию, которую одинаково легко сможет распознать как челоек, так и программа. При этом создать такой документ очень легко - спецификация XML никак не органичивает количество, структуру и имена тегов и аттрибутов, из которых состоит XML-документ. Фактически спецификация XML описывает лишь набор основных структур языка и соглашения об их синтаксисе. Все остальное вы свободны задать так, как вам необходимо. Кроме того спецификация XML позволяет вам самому разработать любой язык разметки, который нужен именно вам, и формально описать его структуру. Т.е. в принципе любой язык разметки текстовых документов может быть описан на языке XML (в том числе, кстати, и язык HTML). Однако это отдельная очень большая тема и здесь мы ее рассматривать не будем.
Все сказанное выше было необходимо для того, чтобы вы поняли основную идею - с помощью XML вы можете описать любые данные в структурированном виде и затем легко обрабатывать эти данные, в том числе и на PHP, о чем и пойдет речь далее.
Способы обработки XML данных в PHP
В PHP существуют 2 модуля работы с XML, реализующие 2 разных стандарта обработки XML-данных: SAX (Simple API for XML) и DOM (Document Object Model). Необходимо вкратце пояснить, что представляют собой эти стандарты.
Стандарт SAX не является стандартом W3C, официальным сайтом для него является http://www.saxproject.org/. Этот стандарт описывает метод парсинга XML документов для получения данных из них. Т.е. этот метод обработки XML-документов позволит вам только прочитать данные из XML-документа и не более того. Создавать и изменять XML-документы с его помощью вы не сможете.
SAX основан на т.н. событийном программировании. Его особенностью является то, что вы предоставляете парсеру XML набор собственных функций, которые будут заниматься обработкой различных типов XML-данных (элементов (тегов), текста и т.п.), а парсер затем будет сам вызывать ваши функции в процессе обработки XML-документа, передавая им найденные данные. Важной особенностью здесь является порядок вызова ваших функций, который вы должны будете учесть при их написании: ваши функции будут вызываться в той же последовательности, в которой соответствующие даные располагаются в XML-документе. В следующем разделе мы рассмотрим пример чтения данных из XML-документа с использованием SAX.
Другим стандартом для обработки XML-данных является DOM - стандарт W3C, спецификацию которого вы можете найти здесь. В отличие от SAX этот метод позволяет вам производить любые операции с XML-данными в очень удобной форме - представляя XML-документ как дерево объектов. Далее мы рассмотрим пример того, как можно работать с XML через DOM из PHP. Исходные тексты всех приведенных здесь примеров можно скачать здесь в виде .zip архива.