| |||||
Переписанная с нуля поддержка XMLКраткое описаниеВведение
В сегодняшнем интернете XML не модное слово, а широко распространенный и используемый стандарт. Поэтому поддержка XML в PHP5 была одним из приоритетных направлений развития. В PHP4 вам приходилось сталкиваться с несовместимой со стандартами, допускающей утечки памяти и неполной реализацией. Несмотря на то, что некоторые из этих недостатков были исправлены в PHP4.3, разработчики решили забыть старую реализацию и написать все с нуля для PHP5. XML в PHP4
PHP поддерживал XML почти с самого начала. Несмотря на то, что поддерживалась только SAX интерфейс, он как минимум позволял разобрать любой XML-документ без особых проблем. Дальнейшая поддержка XML заключалась в domxml расширении PHP4. Потом было добавлено расширение xslt с Sablotron-ом в качестве нижнего уровня. Во время разработки PHP4 в расширение domxml добавилась поддержка HTML, XSLT и проверка по DTD. К сожалению, т.к. расширения xslt и domxml никогда не выходили из экспериментальной стадии и меняли свой интерфейс не один раз, они не компилировались по умолчанию и часто не были установлены. Более того расширение domxml не реализовывало стандарт DOM, определенный W3С, а имело свою систему именования методов. В то время как попытки исправить данную ситуацию были предприняты в PHP4.3 вместе с кучей утечек памяти и других ошибок, расширение никогда не достигало стабильности, и все равно невозможно было исправить глубокие ошибки. К тому же только расширение, реализующее SAX интерфейс, компилировалось по умолчанию, а другие никогда не имели широкого распространения. XML в PHP5
В PHP5 почти все, касающееся поддержки XML, было полностью переписано. Все XML-расширения теперь используют великолепную библиотеку libxml2 из проекта GNOME. Это позволило взаимодействовать разным XML-расширениям, т.к. разработчики теперь работают только с одной базовой библиотекой. Например, довольно сложное и сейчас сильно улучшенное управление памятью реализовывалось только один раз для всех XML-расширений. Поддержка потоков
Все XML-расширения теперь поддерживают потоки повсюду, даже если доступ к ним производит не напрямую из PHP. В PHP5 возможно обратиться к потоку, например, из директивы <xsl:include> или из <xi:xinclude>. В общем, доступ к потокам доступен всюду, где предполагается доступ к файлу. SAXSAX расшифровывается как Simple API for XML, что переводится как «Простой интерфейс для XML. Это интерфейс, основанный на обратных вызовах для разбора XML-докуметов. Поддержка SAX появилась в PHP еще в третьей его версии и долго менялась с тех пор. Для PHP5 программный интерфейс не поменялся, так что старый код должен работать без проблем. Единственными отличием является нижележащая библиотека: expat в PHP4 и libxml2 в PHP5. DOM
DOM (Document Object Model — объектная модель документа) — стандарт доступа к элементам XML, организованным в виде дерева, определенный W3C. В PHP4 расширение domxml использовалось для этого. Основной его проблемой было не следование стандартным именам методов. Также оно долгое время имело утечки памяти, которые были исправлены только в PHP4.3.
<?phpXPath
XPath это в некотором роде язык SQL для XML. C помощью XPath возможно получить список элементов отвечающих некоторым параметрам.
<?phpРасширение классов
В PHP5 стало возможным расширять встроенные класса путем создания потомка. К их числу относится и встроенные классы расширения dom. Однако в данный момент реально можно расширить только класс DomDocument и тот с некоторыми оговорками. Остальные классы вы можете расширить, создать их экземпляры, но практически любое действие по их изменению вызывает исключение DomException с кодом ошибки NO_MODIFICATION_ALLOWED_ERR.
<?phpHTML
В PHP5 появилась возможность, которую многие хотели увидеть еще в PHP4, реализованная в libxml2 — поддержка HTML. Это означает, что теперь возможно не только загрузить правильно сформированный XML, но даже неверно сформированный HTML и получить из него обычный объект DomDocument, с которым можно использовать все возможности DOM, XPath и Simple XML?.
<?phpПроверка на правильность (валидация)
Проверка на правильность XML-документов становится все более и более необходимой. Например, когда вы получаете XML-документ на стороне, то должны вначале проверить его на соответствие некоторым требованиям, прежде чем его обработать. К счастью не нужно писать свой PHP-код для проверки, т.к. возможно использовать один из трех распространенных стандартов для этого: DTD, XML Schema или Relax NG?.
<?phpВ настоящее время все эти методы просто возвращают истину или ложь. Ошибки выводятся в виде предупреждений PHP. Очевидно, что не лучший способ обратной связи и он будет улучшен в одной из версий после PHP5.0.0. SimpleXML
Simple XML? — последнее дополнение в области поддержки XML в PHP. Цель Simple XML? — простой доступ к XML-документам, используя стандартные свойства объектов и итераторы. Это расширение имеет относительно мало методов, но, однако, довольно мощное.
<?phpУдивлены размерами кода? Не забывайте, что это SimpleXML. Что это код делает? Вначале он загружает файл articles.xml в виде SimpleXML объекта. Дальше он получает все элементы с именем item, используя для этого свойство $sxe->item. В итоге $item->title дает нам содержимое элемента title. Доступ к атрибутам также можно легко получить: $item->title['id']. Как можно видеть за этой простотой скрывается некоторая «магия», к тому же имеются несколько путей, чтобы достичь нужного эффекта. Например, $item->title[0] возвращает то же самое, что и в примере. Однако не следует думать, что $sxe->item->title вернет все заголовки в документе – это не XPath. Расширение Simple XML? первое, использующее большинство возможностей доступных в Zend Engine 2?. Оно также является тестовой площадкой для этих новых возможностей. Кроме традиционного метода «цикл по всем узлам», показанным в примере, существует также и интерфейс XPath, который предоставляет еще более легкий доступ к индивидуальным узлам.
<?phpВероятно, что этот код не короче, чем предыдущий, но при более сложных и глубоко вложенных XML-документах XPath вместе с Simple XML? сэкономит множество времени. Запись в SimpleXML
Возможно не только чтение и анализ, но и модификация Simle XML?-документов.
<?phpВзаимодействие с Dom Document?
Поскольку Simple XML? также основан на libxml2, возможно конвертировать объекты SimpleXML в объекты DomDocument и наоборот без большой потери скорости, т.к. документ внутренне не копируется. Используя данный механизм возможно использование лучшего из обоих методик, используя ту, которая лучше подходит к конкретной задаче. Для этого используются следующие методы:
<?phpXSLT
XSLT — язык для трансформации XML-документов в другие XML-документы. Сам XSLT-документ является XML-документом и принадлежит к семейству функциональных языков, имеющих разное назначение по сравнению с процедурными и объектно-ориентированными языками типа PHP.
<?phpПриведенный пример вначале загружает таблицу стилей XSLT articles.xsl с помощью DOM-метода load(). Потом он создает объект класса XsltProcessor, который импортирует таблицу стилей для дальнейшего выполнения, устанавливает параметр titles в значение Titles (параметры могут быть установлены с помощью метода setParameter($namespaceURI, $name, $value)). В конце он начинает трансформацию с помощью метода transformToDoc($inputDom), который возвращает новый DomDocument. Данный интерфейс имеет преимущество, т.к. позволяет произвести несколько трансформаций XSLT, используя только одну таблицу стилей — просто загрузив и повторно используя ее, т.к. transformToDoc() может быть применен к различным XML-документам. Кроме метода transformToDoc() существует еще два метода трансформации: transformToXML($dom), которая возвращает строку, и transformToURI($dom, $uri), который сохраняет трансформированный документ в файл или поток PHP. Следует заметить, что если используются возможности XSLT типа <xsl:output method="html"> или indent="yes", то невозможно воспользоваться transformToDoc(), т.к. DomDocument не поддерживает этого. Эти директивы будут использоваться только, если вывод производится напрямую в строку или файл. Вызов PHP-функций
Одна из последних возможностей добавленных в расширение XSL — вызовы любой PHP-функции из таблицы стилей XSLT. Хотя это не приветствуется многими приверженцами XML/XSLT, может быть очень полезно в некоторых случаях. Поскольку XSLT крайне ограничен, когда дело доходит до функций. Даже вывод даты на разных языках очень сложно реализовать, но с помощью данной возможности это также не сложно, как и с помощью PHP. Приведем пример добавления функции в XSLT.
<?phpТаблица стилей XSLT (datetime.xsl), которая будет вызывать данную функцию: Минимальный XML-файл (today.xml), чтобы прогнать его через таблицу стилей (хотя c articles.xml результат будет тот же): Приведенная таблица стилей, вместе с PHP-скиптом и любым загруженным XML-файлом, выведет текущий день недели на языке, определенном текущей локалью. Возможно добавлять больше параметров в php:function(), которые будут переданы PHP функции. Кроме того, существует функция php:functionString(), которая автоматически конвертирует все параметры в строки, так что вам не нужно их конвертировать в функции. Следует отметить, что перед трансформацией необходимо вызвать метод registerPhpFunctions(), иначе вызовы PHP-функций не будут работать по соображениям безопасности. Более гибкая система доступа, например, запрет доступа только к указанным функциям, пока не доступна, но будет несложно реализовать ее в одной из будущих версий PHP5. Проблемы с обратной совместимостьюПрактически полное отсутствие обратной совместимости. Дополнительные сведения
Описание в оригинальной документации:
Один комментарий.
[Показать комментарии/форму]
| |||||