PHP и XML PHP


Основы DOM

(Document Object Model)

Наиболее широко применяемы XML-расширением на сегодняшний день является DOM и simpleXML, оба из них были добавлены в 5 версии PHP. Кроме данных XML-расширений также применяются XML (XML-парсер) и DOMXML, однако эти технологии считаются устаревшими.

Работа с DOM осуществляется в объектно-ориентированном стиле. Для начала работы с ним нужно создать объект domDocument. На практике это выглядит примерно так:

$dom_xml = new DomDocument;

При создании нового объекта domDocument вызывается конструктор DOMDocument=>__construct, имеющий два необязательных аргумента, которые указывают на версию документа и его кодировку

_ _construct ([string version [, string encoding]])

После создания нового объекта domDocument необходимо загрузить данные. Осуществляется это при помощи методов DOMDocument->load() и DOMDocuтeпt->loadXML() , в первом случае данные загружаются из файла, а во втором из строки. На практике это выглядит примерно так:

//Загрузка данных из файла с явным указанием экземпляра класса:

$dom_xml = new DomDocument;
$dom_xml->load(‘file.xml‘);

//Загрузка данных из файла без явного указания экземпляра класса:

$dom_xml=DomDocument:: load(‘file.xml’);

//Загрузка данных из строки с явным указанием экземпляра класса:

$dom_xml = new DomDocument;
$dom_xml->loadXML(‘ volvo ‘);

//Загрузка данных из строки без явного указания экземпляра класса:

$dom_xml = DomDocument::lоаdХМL(‘ volvo ‘);

Если загрузка данных прошла успешно, то будет возвращено TRUE, если нет, то FALSE

После того как данные загружены чаще всего осуществляется разбор их. Осуществить это можно при помощи метода DomDocument->getElementsByTagName(). Этот метод возвращает коллекцию объектов DOMNode.

$dom_xml= new DomDocument();
$dom_xml->loadXML(‘ volvo Lada ‘);
//записываем название модели в переменную

Foreach ($mod as $element) <
echo $element->nodeValue.» «.$element->nodeName.» «.’
‘;
>
?>

volvo model
Lada model

Основные свойства объекта DOMNode

nodeValue Возвращает значения узлов childNodes Возвращает дочерние узлы для текущего узла firstChild Возвращает верхний (первый) дочерний узел lastChild Возвращает последний дочерний узел

Основные методы объекта DOMNode

removeChild() hasChildNodes() Осуществляет проверку на дочерние узлы appendChild() Добавляет элемент replaceChild() Замещает узел hasAttributes() Проверка атрибутов

Примеры работы с DOM можно увидеть на следующих страницах:

PHP и XML

24.04.2012, 22:29

XML SOAP PHP 1с(Нужно забрать XML c веб сервиса)
Хелп плиз есть веб сервис раскатанный на 1с .

PHP и XML
Здравствуйте, при парсинге XML столкнулась с такой проблемой: дублируется текст таблицы, то есть.

php в xml 🙂
Нужно встроить php код в xml файл, возникли проблемы с обработкой .

Из xml в php
Приветствую. Как сделать так чтобы под каждыми степенями были свои курсы? 2 25.04.2012, 00:22 2 25.04.2012, 22:51 [ТС] 3

Решение

спасибо за ссылку — обязательно опробую. вот только вопрос, а как можно структуру xml отправить на определенный адрес методом POST? а самое интересное, как после этого принять ответ в той же самой структуре xml?

Добавлено через 40 минут
что то не получается. взял вот этот код и переработал под себя:

ошибок нет, но и на экран ничего не выводится. подскажите что тут не так?

Добавлено через 56 минут
с кодом разобрался. но вопросы про POST остаются в силе.

Добавлено через 7 минут
и еще пара вопросов: 1. можно ли чем то заменить foreach, т.к. ответ содержит только одну строку? и второй вопрос, как подсунуть в

Создание XML-документа на PHP

В предыдущих статьях по стандарту DOM я упоминал, что он огромен. В нём сотни самых различных свойств и методов у десятков классов. Всё это выучить достаточно тяжело и, главное, не нужно. Ваша главная задача — это уметь создавать XML-документы и парсить их. И в этой статье мы с Вами будем заниматься созданием XML-документа на PHP.

В нижеследующем примере идёт генерация XML-документа на PHP:

createElement(«users»); // Создаём корневой элемент
$dom->appendChild($root);
$logins = array(«User1», «User2», «User3»); // Логины пользователей
$passwords = array(«Pass1», «Pass2», «Pass3»); // Пароли пользователей
for ($i = 0; $i $user = $dom->createElement(«user»); // Создаём узел «user»
$user->setAttribute(«id», $id); // Устанавливаем атрибут «id» у узла «user»
$login = $dom->createElement(«login», $logins[$i]); // Создаём узел «login» с текстом внутри
$password = $dom->createElement(«password», $passwords[$i]); // Создаём узел «password» с текстом внутри
$user->appendChild($login); // Добавляем в узел «user» узел «login»
$user->appendChild($password);// Добавляем в узел «user» узел «password»
$root->appendChild($user); // Добавляем в корневой узел «users» узел «user»
>
$dom->save(«users.xml»); // Сохраняем полученный XML-документ в файл
?>

Всё самое основное, что Вы должны знать при создании XML-документов через PHP, находится в данном примере. Код я постарался хорошо прокомментировать, поэтому вопросов возникнуть не должно. Вы, обладая данными знаниями, уже можете создать практически любой XML-документ, используя стандарт DOM. А в следующей статье я Вам покажу, как парсить XML-документ через PHP.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):

  • Комментарии ( 1 ):

    Всем добрый… Маленькое уточнение: когда пользуетесь методом $dom->createElement(x,y) следите чтобы «y» НИКОГДА не был пустым! Иначе будут чудеса в порождаемом XML 🙂

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

    Работа с XML средствами PHP

    Давайте начнем с самого простого: загрузки и выгрузки XML-документа с использованием DOM. Основной класс, который мы будем использовать, это DOMDocument. Через него можно создавать новые документы, сохранять их, а также загружать существующие.

    Как получить список дочерних узлов

    Свойство nodeName содержит название элемента (в данном случае, item ), а nodeValue содержимое элемента (в данном случае, « Первый » и « Второй »).

    Работа с атрибутами узлов

    Давайте посмотрим, как получить значение атрибута узла, устанавить новое значение, создать и удалить атрибут:

    Как получить параметры из XML-файла на PHP?

    Представим, что перед вами стоит задача – спарсить данные из XML-файла. Поскольку структура таких файлов может быть разной, то и трудности при написании своего скрипта также могут быть разными.

    Сегодня на примере одного из таких файлов я покажу, как с помощью PHP получить тот или иной параметр.

    Итак, перед нами файл price.xml с примерно такой структурой:

    Для теста получим его содержимое, а именно – данные из поля URL:

    Вроде бы все просто. А теперь попробуем получить значение, например, параметра «цвет» – и у большинства новичков здесь начинают возникать трудности.

    А решается эта проблема довольно просто с помощью использования «XPath» – специального языка, созданного для запросов к элементам XML.

    В таком случае мы получаем значение «Синий», что нам и необходимо, а остальные параметры — получаются по аналогии.

    Взаимодействие PHP и XML

    Введение

    Прежде чем начать изучать способы работы PHP с XML , полезно хотя бы вкратце ознакомиться с самой технологией XML . В первой части лекции будут рассмотрены основные понятия этой технологии, базовый синтаксис XML–документов, области ее применения, а также понятие DOM XML . Вторая часть лекции посвящена непосредственно вопросам обработки XML при помощи PHP . Сюда входит установка расширения DOM XML , описание и примеры использования некоторых встроенных в PHP функций для обработки XML-документов.

    В качестве примера рассмотрим XML — файл , содержащий описания личностей, и попытаемся научиться добавлять, удалять и находить личность или отдельные элементы ее описания в этом файле с помощью PHP .

    Основные понятия

    XML (Extensible Markup Language) – это расширяемый язык разметки, являющийся подмножеством языка SGML и поэтому имеющий общие с ним цели – разметка любого типа документов.

    XML имеет много общего с языком разметки HTML, но они различны по своему назначению. HTML, как и XML , является подмножеством SGML , но предназначен только для отображения информации в браузере. XML же предназначен для структурированного хранения информации и не содержит никаких конструкций для отображения этих данных.

    Для отображения данных, хранящихся в XML -формате, используются различного рода преобразователи, например язык трансформаций XSLT . Комбинация XML + преобразователь позволяет достичь того же результата, что и использование HTML-форматированного отображения документа пользователю. Однако в случае использования XML и преобразователя данные хранятся отдельно от их представления, т. е. от инструкций о том, как они должны отображаться.

    XML очень похож на HTML по своему синтаксису, за исключением того, что теги XML можно придумывать собственные. По аналогии с HTML внутри XML -тегов можно использовать атрибуты. Каждый тег XML должен иметь соответствующий закрывающий тег (в HTML это не является обязательным). Каждый XML-документ начинается со строки декларации, например:

    которая указывает на версию языка XML (атрибут version), кодировку текста в этом документе (атрибут encoding ) и показывает, существует ли документ сам по себе или зависит от других файлов (атрибут standalone ).

    Приведем пример XML-документа.

    Пусть у нас имеется письмо. Содержащуюся в нем информацию можно хранить в следующем виде:

    Сохранив этот файл, например, как note.xml , мы можем переслать его кому-нибудь, просмотреть с помощью браузера или использовать в программе. В частности, можно использовать этот XML-документ в своей PHP-программе.

    С помощью XML можно создать документ для описания любой информации. Для того чтобы другие разработчики могли создавать документы в этом же XML -языке (т.е. используя те же теги) и чтобы можно было проверить правильность созданного документа (его соответствие выбранному XML -языку), нужно формально описать используемый XML -язык. Это делается с помощью механизмов DTD (Document Type Definition) или Schemas , которые дают возможность создавать шаблоны для новых типов документов. Для экспериментов в домашних условиях создавать DTD -описания необязательно. Важно понимать, что XML на самом деле вовсе не язык, а стандарт для создания языков, отвечающих критериям XML .

    Между XML-документами могут быть установлены ссылки, один документ может включать в себя другой, т.е. структура документа может быть сколь угодно сложной.

    Элементы в XML -документах могут быть связаны между собой отношениями родитель/потомок или родственник/родственник. В нашем примере является родителем , который в свою очередь является потомком , а , и являются родственниками. Собственно текст тоже является потомком элемента , например, » Вася Иванов » – потомок элемента . Такая структура называется деревом; любые части дерева, имеющие потомков , называются ветвями, а не имеющие – листьями.

    Php. Как работать с XML-файлами? Часть 1.

    Главная >> Backend >> Php. Как работать с XML-файлами? Часть 1.

    Php. Как работать с XML-файлами? Часть 1.

    Работа с XML — частая и привычная задача, которая никогда не должна вызывать затруднения. Разве что не более 5 минут, чтобы найти доку с примерами и освежить все в памяти.

    Вариант подобной статьи хочу предложить, т.к. буквально пару часов назад писал парсер прайса для своего магазина интимны товаров.

    Итак, удобнее всего работать с XML при помощи встроенной библиотеки SimpleXML.

    Итак, пример файла на базе которого будем строить все примеры:

    ГЛАВА 14. PHP и XML

    Бесспорно, развитие World Wide Web оказало заметное влияние на способы обмена информацией. Вследствие огромных размеров этой электронной сети соблюдение стандартов превратилось из простого удобства в обязательное требование — конечно, если ваша организация собирается в полной мере использовать потенциал Web. Одним из таких стандартов является язык XML (extensible Markup Language) — удобное средство обмена данными между организациями и приложениями.

    В начале этой главы приведены общие сведения о XML, при этом особое внимание уделяется общему синтаксису языка. Второй раздел посвящен средствам PHP для работы с XML. Мы рассмотрим стандартные функции поддержки XML, а также схему общего процесса обработки файлов в формате XML. Этот материал позволит вам лучше понять, чем же так ценен XML и как PHP может применяться для разработки полезных и интересных приложений на базе XML.

    Но прежде чем переходить к непосредственному описанию XML, я расскажу о том, как же развивались концепции, в конечном счете приведшие к возникновению формата XML.

    Разметка текста

    Как нетрудно предположить по его названию, язык HTML (HyperText MarkUp Language) относится к числу так называемых языков разметки текста (markup languages). Под термином «разметка» понимается общая служебная информация, которая не выводится вместе с документом, но определяет; как должны выглядеть те или иные фрагменты документа. Например, вы можете потребовать, чтобы какое-либо слово выводилось жирным или курсивным шрифтом, вывести отдельный абзац особым шрифтом или оформлять заголовки увеличенным шрифтом. Текстовый редактор, в котором я ввожу этот абзац, тоже использует особую форму разметки для представления тех атрибутов форматирования, которые я выбираю. Таким образом, в нем тоже используется особая разновидность языка разметки. Короче говоря, язык разметки, используемый моим текстовым редактором, представляет собой средство для описания визуального оформления текста в моих документах.

    В наши дни существует множество разных языков разметки. Например, в коммуникационных программах особая форма разметки определяет смысл каждого пакета из нулей и единиц, пересылаемого в Интернете. Когда мы подчеркиваем слова в книге, это тоже можно считать своего рода разметкой. Впрочем, любой язык разметки должен решать две важные задачи:

    1. Язык определяет синтаксис разметки. Например, в соответствии со спецификацией HTML конструкция text определяет синтаксически правильную разметку текста, а конструкция text считается неправильной из-за несовпадения открывающего и закрывающего тегов.
    2. Язык определяет смысл разметки. Конечно, вы знаете, что команда text выводит слово text жирным шрифтом. В данном случае определяется смысл, связанный с объявлением некоторого компонента документа.

    Стремительное развитие Web за последние несколько лет наглядно показывает, что самым популярным языком разметки текста является HTML. Но как появился этот язык? Кто закрепил за тегами и определенный смысл в документе? Чтобы ответить на этот вопрос, необходимо познакомиться с предшественником HTML — SGML (Standard Generalized Markup Language).

    Язык SGML

    SGML представляет собой международный стандарт обмена электронной информацией между различными аппаратными и программными компонентами. По названию можно предположить, что SGML — это язык. На самом деле это не совсем так, поскольку SGML в действительности определяет формализованный набор правил для создания языков. На базе SGML были созданы два самых популярных языка разметки — HTML и XML. Как вы уже знаете, HTML — плат-форменно- и аппаратно-независимый язык, предназначенный для форматирования и отображения текста. То же самое можно сказать и о XML.

    Появление стандарта SGML было обусловлено необходимостью совместного использования данных разными приложениями и операционными системами. Даже в далеких 60-х годах у пользователей компьютеров возникало немало проблем с совместимостью. Проанализировав недостатки многих нестандартных языков разметки, трое ученых из IBM — Чарльз Гольдфарб (Charles Goldfarb), Эд Мо-шер (Ed Mosher) и Рэй Лори (Ray Lorie) — сформулировали три общих принципа, обеспечивающих возможность совместной работы с документами в разных операционных системах:

    • Использование единых принципов форматирования во всех программах, выполняющих обработку документов. Вполне логичное требование — всем нам хорошо известно, как трудно договориться между собой людям, говорящим на разных языках. Наличие единого набора синтаксических конструкций и общей семантики заметно упрощает взаимодействие между программами.
    • Специализация языков форматирования. Благодаря возможности построения специализированного языка на базе набора стандартных правил программист
    • перестает зависеть от внешних реализаций и их представлений о потребностях конечного пользователя
    • Четкое определение формата документа. Правила, определяющие формат документа, задают количество и маркировку языковых конструкций, используемых в документе. Применение стандартного формата гарантирует, что пользователь будет точно знать структуру содержимого документа. Обратите внимание: речь идет не о формате отображения документа, а о его структурном формате. Набор правил, описывающих этот формат, называется «определением типа документа» (document type definition, DTD).


    Эти три правила были заложены в основу предшественника SGML — GML (Generalized Markup Language). Исследования и разработка GML продолжались около десяти лет, пока в результате соглашения, заключенного международной группой разработчиков, не появился стандарт SGML.

    В 1980-х годах необходимость в общих средствах обмена информацией непрерывно возрастала, и SGML вскоре превратился в отраслевой стандарт (в 1986 году он был принят в качестве стандарта ISO). Даже в наши дни этот стандарт занимает достаточно сильные позиции, поскольку многие организации, работающие с огромными объемами информации, полагаются на SGML как на удобное и надежное средство хранения данных. Чтобы подкрепить сказанное, замечу, что Бюро патентов и товарных знаков США ( http://www.uspto.gov ), Служба внутренних сборов США ( http://www.irs.gov ) и Библиотека Конгресса ( http://lcweb.loc.gov ) используют SGML в своих основных приложениях. Только представьте, какой объем документации проходит через эти организации за год!

    Одним из лучших ресурсов Интернета, посвященных SGML, XML и другим языкам раз-метки, является сайт Robin Cover/OASIS XML Cover Pages ( http://www.oasis-open.org/cover ).

    Идея передачи гипертекстовых документов через web-браузер, предложенная Тимом Бернерсом-Ли (Tim Berners-Lee), не требовала многих возможностей, поддерживаемых полной реализацией SGML. В результате появился известный язык разметки HTML.

    Пришествие HTML

    Концепция World Wide Web идеально соответствовала идее применения обобщенного языка разметки для упрощения обмена информацией в среде, содержащей множество разных аппаратных конфигураций, операционных систем и программных реализаций. Несомненно, Бернерс-Ли учитывал это обстоятельство, поскольку он смоделировал первую версию HTML на основе стандарта SGML. HTML унаследовал некоторые характеристики SGML, в том числе простой обобщенный набор тегов и особую роль угловых скобок. Простые документы в формате HTML можно прочитать в любой компьютерной системе, в которой предусмотрены средства для просмотра текстовых документов. Все остальное — история.

    Тем не менее, у HTML имеется существенный недостаток: он не позволяет разработчику создавать собственные типы документов. Результатом стала «война браузеров», в ходе которой разработчики браузеров начали создавать свои собственные усовершенствования языка HTML. Эти модификации существенно отклонялись от идеи работы с единым стандартом HTML и вызвали настоящий хаос среди разработчиков, которые хотели создавать web-сайты, не зависящие от браузера. Более того, долгий период неопределенности в области стандартов привел к тому, что разработчики вывели язык из первоначально задуманных границ. Думаю, подавляющее большинство web-страниц современного Интернета вообще не соответствуют текущей спецификации HTML.

    Реакцией консорциума W3 (http://www.w3.org) на быстро ухудшающуюся ситуацию стала попытка вернуть развитие HTML на правильный путь — другими словами, вернуться к истокам SGML. Результатом этих усилий стал XML.

    XML как неопровержимое свидетельство эволюции

    XML воплощает все усилия, предпринятые W3 в области выработки Интернет-стандарта, который бы соответствовал трем главным принципам SGML (см. предыдущий раздел). XML, как и SGML, не является языком; он также представляет собой набор рекомендаций, на базе которых создаются другие языки. Точнее говоря, XML является конгломератом из трех отдельных спецификаций:

    • XML (Extensible Markup Language) — спецификация, определяющая базовый синтаксис XML;
    • XSL (Extensible Style Language) — спецификация, направленная на отделение визуального оформления страницы от ее содержимого за счет применения к документу стилей (style sheets), определяющих конкретные атрибуты форматирования;
    • XLL (Extensible Linking Language) — спецификация, определяющая представление ссылок на другие ресурсы.

    XML не только позволяет разработчикам создавать специализированные языки для Интернет-приложений; он также обеспечивает возможность проверки этих документов на соответствие спецификации XML. Более того, XML действительно реализует концепцию данных, не зависящих от реализации, поскольку формат отображаемого документа можно точно описать при помощи XSL. Допустим, вы переформатировали свой web-сайт, чтобы он хранился в формате XML. После этого’ вы сможете использовать один стиль для форматирования исходного текста XML на портативном компьютере типа Palm Pilot, а другой — для форматирования на мониторе обычного компьютера. В обоих случаях код XML остается одним и тем же, изменяется только его форматирование в соответствии с используемым устройством.

    Примером популярного языка, созданного на базе XML, является WML (Wireless Markup Language).

    Знакомство с синтаксисом XML

    Для большинства читателей, знакомых с SGML или HTML, структура документов XML не содержит ничего нового. Пример простого документа XML приведен в листинге 14.1.

    Листинг 14.1. Пример документа XML

    Spaghetti alla Carbonara

    This traditional Italian dish is sure to please even the most discriminating

    4 strips of bacon

    12 ounces spaghetti

    3 tablespoons olive oil

    Combine oil and bacon in large skillet over medium heat. Cook until bacon is

    brown and crisp.

    whisk eggs in bowl. Set aside.

    Cook pasta in large pot of boiling water to taste, stirring occasionally.

    Add salt as necessary.

    Drain pasta and return to pot. adding whisked eggs. Stir over medium-low

    heat for 2-3 minutes.

    Mix in bacon. Season with salt and pepper to taste.

    Обратите внимание на основные компоненты, из которых состоит документ XML:

    • пролог XML;
    • теги;
    • атрибуты;
    • ссылки на сущности;
    • инструкции по обработке;
    • комментарии.

    Все документы XML начинаются с пролога (prolog). Пролог сообщает, что документ написан на XML, а также указывает, какая версия XML при этом использовалась.

    Поскольку текущая версия XML имеет номер 1.0, все ваши документы XML должны начинаться со строки

    Следующая строка в листинге 14.1 указывает на внешний DTD. Пока не обращайте на нее внимания — DTD подробно рассматриваются в следующем разделе «Определение типа документа (DTD)»:

    Оставшаяся часть листинга 14.1 состоит из элементов, очень похожих на элементы документов HTML. Первый элемент, cookbook, называется корневым элементом (root element), поскольку в эту пару тегов заключены все остальные теги документа. Конечно, вы можете присвоить корневому элементу любое имя по своему усмотрению. Главное, о чем следует помнить, — все остальные элементы должны находиться внутри пары корневых тегов.

    Пролог может содержать другие инструкции. Например, объявление можно расширить, указав, что документ является автономным:

    Присваивание yes атрибуту standalone сообщает механизму обработки XML-кода о том, что документ не импортирует других файлов (например, DTD).

    Хотя это расширение, как и многие другие, приносит несомненную пользу, я сокращаю описание синтаксиса до минимума, чтобы лучше выделить основную тему этой главы — совместное использование PHP и XML.

    Оставшаяся часть документа состоит в основном из различных служебных элементов и соответствующих данных. Служебные элементы легко узнать по угловым скобкам (как в разметке HTML). Элемент может быть пустым или содержащим информацию; в этом случае элемент содержит открывающий и закрывающий теги. Если элемент не пуст, то в теги включаются имена, описывающие природу данных. Как видно из листинга 14.1, эти теги очень похожи на теги документов HTML. Впрочем, следует помнить о некоторых важных различиях:

    • Непустые элементы должны содержать как открывающий, так и закрывающий тег. В элементах, которые логически не могут иметь закрывающего тега, используется альтернативная форма синтаксиса . Возникает вопрос — у каких элементов нет закрывающего тега? Достаточно вспомнить некоторые теги форматирования HTML — например,
      , и , у них нет парных тегов. Теги этого формата могут создаваться и в документах XML
    • Элементы XML должны находиться на правильном уровне вложенности. Документ XML, приведенный в листинге 14.1, синтаксически правилен; другими словами, теги элементов не встречаются там, где их быть не должно. Например, следующий фрагмент недопустим:

    Spaghetti alia Carbonara

    • В элементах XML различается регистр символов. Некоторым читателям это наверняка не понравится. Например, в XML теги , и считаются разными тегами. Привыкайте поскорее — с непривычки это может свести вас с ума.

    Теги XML, по аналогии с тегами HTML, могут обладать атрибутами. Атрибуты содержат дополнительную информацию о содержании, которая в дальнейшем используется при форматировании или обработке XML. Значения атрибутов присваиваются в формате «имя=значение», и, в отличие от HTML, атрибуты XML должны быть заключены в апострофы или кавычки. В листинге 14.1 встречается пример использования атрибута:

    Атрибут сообщает, что данный рецепт (recipe) относится к категории «итальянской кухни» (italian). Наличие такой информации упрощает дальнейшую группировку и обработку данных.

    Ссылки на сущности

    Концепция сущности (entity) упрощает сопровождение документа, обеспечивая возможность ссылки на некоторое содержание по ключевым словам. Ключевое слово может относиться как к простейшему фрагменту вроде расширения аббревиатуры, так и к совершенно новому фрагменту кода XML. Сущности удобны тем, что они могут многократно использоваться в документах XML. При последующей обработке документа все ссылки на сущность заменяются конкретным содержанием, указанным при объявлении сущности. Объявление сущности включается в DTD документа XML.

    Чтобы сослаться на некоторую сущность в документе HTML, следует указать ее имя с префиксом «амперсанд» (&) и суффиксом «точка с запятой» (;). Допустим, вы объявили сущность с информацией об авторских правах. После этого на данную сущность можно ссылаться следующим образом:

    При этом строка документа XML может выглядеть так:

    . прочие данные колонтитула.

    Сущности, как и переменные и шаблоны, часто применяются в ситуациях, когда некоторая информация может измениться в будущем или документ содержит множество повторяющихся ссылок. Мы вернемся к проблемам объявления ссылок в разделе «Определение типа документа (DTD)».

    Инструкции по обработке

    Инструкции по обработке (processing instructions, PI) представляют собой внешние команды, которые выполняются приложением, работающим с документом XML.


    В общем случае синтаксис PI выглядит так:

    Атрибут приложение указывает, какой программе адресованы последующие инструкции. Например, для выполнения команды PHP в документе XML можно воспользоваться следующей конструкцией:

    Инструкции по обработке удобны тем, что они позволяют нескольким приложениям совместно работать с одним документом.

    Комментарии принадлежат к числу основных возможностей любого языка. В XML используется тот же синтаксис комментариев, что и в HTML:

    Итак, мы проанализировали структуру типичного документа XML. Но у документов XML существует еще один важный аспект — определение типа документа (DTD).

    Определение типа документа (DTD)

    DTD представляет собой совокупность синтаксических правил, на основе которых проверяется структура документа XML. В DTD явно определяется структура документа XML, указываются элементы и их атрибуты, а также приводится другая информация, распространяющаяся на все документы XML, созданные на основе данного DTD.

    Учтите, что наличие DTD не является обязательным. Если DTD существует, система XML руководствуется им при интерпретации документа XML. Если DTD отсутствует, предполагается, что система XML должна интерпретировать документ по собственным правилам. Впрочем, для документов XML все же рекомендуется создавать DTD, поскольку это упрощает их интерпретацию и проверку структуры.

    DTD можно включить непосредственно в документ XML, сослаться на него по URL или использовать комбинацию этих двух способов. При непосредственном включении DTD в документ XML определение DTD располагается сразу же после пролога:

    Атрибут имя_корневого_элемента соответствует имени корневого элемента в тегах, содержащих весь документ XML. В секции «прочих объявлений» находятся определения элементов, атрибутов и т. д.

    Возможно, вы предпочитаете разместить DTD в отдельном файле, чтобы обеспечить модульную структуру программы. Давайте посмотрим, как выглядит ссылка на внешний DTD в документе XML. Задача решается одной простой командой:

    Как и в случае с внутренним объявлением DTD, имя_корневого_элемента должно соответствовать имени корневого элемента в тегах, содержащих весь документ XML. Атрибут SYSTEM указывает на то, что some_dtd.dtd находится на локальном сервере. Впрочем, на файл some_dtd.dtd также можно сослаться по его абсолютному URL. Наконец, в кавычках указывается URL внешнего DTD, расположенного на локальном или на удаленном сервере.

    Как же создать DTD для листинга 14.1? Во-первых, мы собираемся создать в документе XML ссылку на внешний DTD. Как упоминалось в предыдущем разделе, ссылка на DTD выглядит так:

    Возвращаясь к листингу 14.1, мы видим, что cookbook является именем корневого элемента, a cookbook.dtd — именем DTD-файла. Содержимое DTD показано в листинге 14.2, а ниже приведены подробные описания всех строк.

    Листинг 14.2. DTD для листинга 14.1 (cookbook.dtd)

    Что же означает этот загадочный документ? Несмотря на внешнюю сложность, в действительности он довольно прост. Давайте переберем все содержимое листинга 14.2:

    Перед нами пролог XML, о котором уже говорилось выше.

    Третья строка описывает элемент XML, в данном случае — корневой элемент cookbook. После него следует слово recipe, заключенное в круглые скобки. Это означает, что в теги cookbook заключается вложенный тег с именем recipe. Знак + говорит о том, что в родительских тегах cookbook находится одна или несколько пар тегов recipe.

    Четвертая строка описывает тег recipe. В ней сообщается, что в тег recipe входят четыре вложенных тега: title, description, ingredients и process. Поскольку после имен тегов не указываются признаки повторения (см. следующий раздел), внутри тегов recipe должна быть заключена ровно одна пара каждого из перечисленных тегов.

    Перед нами первое определение тега, который не содержит вложенных тегов. В соответствии с определением он содержит #PCDATA, то есть произвольные символьные данные, не считающиеся частью разметки.

    В соответствии с определением элемент ingredients содержит один или несколько тегов с именем ingredient. Обратитесь к листингу 14.1, и вы все поймете.

    Поскольку элемент ingredient соответствует отдельному ингредиенту, вполне логично, что этот элемент содержит простые символьные данные.

    Элемент process содержит один или несколько экземпляров элемента step.

    Элемент step, как и элемент ingredient, соответствует отдельному пункту в списке более высокого уровня. Следовательно, он должен содержать символьные данные.

    Обратите внимание: элемент recipe в листинге 14.1 содержит атрибут. Этот атрибут, category, определяет общую категорию, к которой относится рецепт — в приведенном примере это категория «итальянская кухня» (Italian). В определении ATTLIST указывается как имя элемента, так и имя атрибута. Кроме того, отнесение каждого рецепта к определенной категории упрощает классификацию, поэтому атрибут объявляется обязательным (#REQUIRED).

    Последняя строка просто завершает определение DTD. Определение всегда должно быть должным образом завершено, иначе произойдет ошибка.

    В завершение этого раздела я приведу сводку основных компонентов типичного DTD-файла:

    • объявления типов элементов;
    • объявления атрибутов;
    • ID, IDREF и IDREFS;
    • объявления сущностей.

    Некоторые из этих компонентов уже встречались нам в описании листинга 14.2. Далее каждый компонент будет описан более подробно.

    Все элементы, используемые в документе XML, должны быть определены в DTD, прилагаемом к документу. Мы уже встречались с двумя распространенными разновидностями определений: для элемента, содержащего другие элементы, и элемента, содержащего символьные данные. Данное определение свидетельствует, что элемент содержит только символьные данные:

    Следующее определение элемента process говорит о том, что он содержит ровно один вложенный элемент с именем step:

    Впрочем, процессы (process) из одного шага (step) встречаются довольно редко — скорее всего, шагов будет несколько. Чтобы указать, что элемент содержит один или несколько экземпляров вложенного элемента step, следует воспользоваться признаком повторения:

    Количество вложенных элементов можно задать несколькими способами. Полный список операторов элементов приведен в табл. 14.1.

    Таблица 14.1. Операторы элементов

    Признак Значение
    ? Ноль или ровно один экземпляр
    * Ноль или несколько экземпляров
    + Один или несколько экземпляров
    Ровно один экземпляр
    | Один из элементов
    , Перечисление элементов

    Если элемент будет содержать несколько вложенных элементов, их следует перечислить через запятую в определении родительского элемента:

    Поскольку признаки повторения не указаны, каждый тег должен встречаться ровно один раз.

    Определение элемента уточняется при помощи логических операторов. Предположим, вы работаете с рецептами, в которые всегда входят макароны (pasta) с одним или несколькими типами сыра (cheese) или мяса (meat). В этом случае элемент ingredient определяется следующим образом:

    Поскольку элемент pasta обязательно должен присутствовать в элементе ingredient, он указывается с признаком повторения +. Затем следует либо элемент cheese, либо элемент meat; мы разделяем альтернативы вертикальной чертой и заключаем их в круглые скобки со знаком +, поскольку в рецепт всегда входит либо одно, либо другое.

    Существуют и другие разновидности определений элементов. Мы рассмотрели лишь простейшие случаи. Тем не менее, приведенного материала вполне достаточно для понимания примеров, приведенных в оставшейся части этой главы.

    Атрибуты элементов описывают значения, связываемые с элементами. Элементы XML, как и элементы HTML, могут иметь ноль, один или несколько атрибутов. Общий синтаксис объявления атрибутов выглядит следующим образом:

    Тем не менее, как видно из приведенного общего определения, допускается одновременное объявление нескольких атрибутов. Допустим, в дополнение к атрибуту category вы хотите связать с элементом recipe дополнительный атрибут difficulty (сложность приготовления). Оба атрибута объявляются в одном списке:

    Форматировать объявления подобным образом необязательно; тем не менее, многострочные объявления нагляднее однострочных. Кроме того, поскольку оба атрибута являются обязательными, тег reci ре не может ограничиться каким-нибудь одним атрибутом, он должен включать в себя оба атрибута сразу. Например, следующий тег будет считаться неверным:

    Почему? Потому что в нем отсутствует атрибут category. Правильный тег должен содержать оба атрибута:

    Особые условия обработки атрибута описываются тремя флагами, перечисленными в табл. 14.2.

    Таблица 14.2. Флаги атрибутов

    Описание #FIXED

    Во всех экземплярах элемента в документе атрибуту может присваиваться только одно конкретное значение

    Если атрибут не указан в элементе, используется значение по умолчанию

    Атрибут является обязательным и должен присутствовать во всех экземплярах элемента в документе

    Атрибут элемента может объявляться с определенным типом. Типы атрибутов описаны далее.

    Очень часто атрибуты содержат общие символьные данные. Такие атрибуты называются атрибутами CDATA. Следующий пример уже встречался в начале этого раздела:

    Атрибуты ID, IDREF и IDREFS

    Идея однозначного представления данных (например, информации о пользователе или товаре, хранящейся в базе данных) посредством идентификаторов неоднократно встречалась в предыдущих главах книги. Идентификаторы также часто используются в XML, поскольку перекрестные ссылки между документами применяются не только в общих задачах обработки данных, но и в World Wide Web (гиперссылки).

    Идентификаторы элементов присваиваются атрибуту ID. Допустим, вы хотите связать с каждым рецептом уникальный идентификатор. Соответствующий фрагмент DTD может выглядеть так:

    После этого объявление элемента recipe в документе может выглядеть так:


    Spaghetti alla Carbonara

    Рецепт однозначно определяется идентификатором ital003. Следует помнить, что атрибут redpe-id относится к типу ID, поэтому ital003 не может использоваться в качестве значения атрибута recipe-id другого элемента, в противном случае документ будет считаться синтаксически неверным. Теперь допустим, что позднее вы захотели сослаться на этот рецепт из другого документа — скажем, из списка любимых рецептов пользователя. Именно здесь в игру вступают перекрестные ссылки и атрибут IDREF. Атрибуту IDREF присваивается идентификатор, используемый для ссылок на элемент, — по аналогии с тем, как URL используется для идентификации страницы в гиперссылке. Рассмотрим следующий фрагмент кода XML:

    В процессе обработки документа XML элемент заменяется более наглядной ссылкой на рецепт с указанным идентификатором (например, названием рецепта). Вероятно, он будет отформатирован в виде гиперссылки, чтобы упростить переход к указанному рецепту.

    При объявлении атрибута можно перечислить все допустимые значения, принимаемые атрибутом. В нашем примере это было бы удобно, поскольку вы можете сразу определить список допустимых категорий. Приведенное выше объявление записывается в следующем виде:

    Если атрибут category не задан явно, по умолчанию ему пр исваивается значение Italian.

    Атрибуты ENTITY и ENTITIES

    Данные в документах XML не всегда являются текстовыми — документ может содержать и двоичную информацию (например, графику). На такие данные можно ссылаться при помощи атрибута entity. Например, в описании элемента description можно указать атрибут recipePicture с графическим изображением:

    Также можно объявить сразу несколько сущностей, заменив ENTITY на ENTITIES. Значения разделяются пробелами.

    Атрибуты NMTOKEN и NMTOKENS

    Атрибуты NMTOKEN представляют собой строки из символов, входящих в ограниченный набор. Объявление атрибута с типом NMTOKEN предполагает, что значение атрибута соответствует установленным ограничениям. Как правило, значение атрибута NMTOKEN состоит из одного слова:

    Можно объявить сразу несколько атрибутов, заменив NMTOKEN на NMTOKENS. Значения разделяются пробелами.

    Объявление сущности напоминает команду define в некоторых языках программирования, включая PHP. Ссылки на сущности кратко упоминались в предыдущем разделе «Знакомство с синтаксисом XML». На всякий случай напомню, что ссылка на сущность используется в качестве замены для другого фрагмента содержания. В процессе обработки документа XML все вхождения сущности заменяются содержанием, которое она представляет. Существует два вида сущностей: внутренние и внешние.

    Внутренние сущности напоминают строковые переменные, связывающие имя с фрагментом текста. Например, если вы хотите определить имя для ссылки на информацию об авторских правах, можно объявить сущность следующего вида:

    В процессе обработки документа все экземпляры &Соруright заменяются текстом «Copyright 2000 YourCompanyName. All Rights Reserved». Весь код XML в заменяющем тексте обрабатывается так, словно он присутствовал в исходном документе.

    Внутренние сущности удобны в ситуациях, когда вы планируете использовать сущность в относительно небольшом количестве документов XML. При большом количестве документов лучше воспользоваться внешними сущностями.

    Внешние сущности используются для ссылок на содержание, находящееся в другом файле. Сущности этого типа могут содержать текстовую информацию, но также могут ссылаться и на двоичные данные (например, графику). Возвращаясь к предыдущему примеру, допустим, что вы решили сохранить информацию об авторских правах в отдельном файле, чтобы упростить ее редактирование в будущем. Ссылка на созданный файл выглядит следующим образом:

    При последующей обработке документа XML все ссылки &Соруright заменяются содержимым документа copyright.xml. Весь код XML в заменяющем тексте обрабатывается так, словно он присутствовал в исходном документе.

    Внешние сущности также удобно использовать для ссылок на графические изображения. Например, если вы хотите включить в документ XML графический логотип, создайте внешнюю сущность:

    Как и в предыдущем примере, все ссылки &food_picture заменяются графическим изображением, на которое указывает ссылка. Поскольку данные являются двоичными, а не текстовыми, они не интерпретируются.

    Ресурсы, посвященные XML

    Хотя приведенного выше материала вполне достаточно для понимания базовой структуры документов XML, данное описание не является полным. Ниже приведены ссылки на ресурсы Интернета, содержащие более подробную информацию:

    В оставшейся части главы рассказано о том, как использовать PHP для обработки документов XML. На первый взгляд задача кажется очень сложной (лексический анализ любых документов любого типа вызывает немало затруднений).

    Но стоит познакомиться с базовой стратегией работы с XML в PHP, и все оказывается на удивление просто.

    PHP и ХМL

    Для работы с XML в PHP используется пакет Джеймса Кларка (James Clark) Expat (XML Parser Toolkit) — cm. http://www.jclark.com/xml. Expat включается в поставку Apache 1.3.7 и более поздних версий, поэтому вам не придется специально загружать его, если вы используете свежую версию Apache. Чтобы воспользоваться функциональными возможностями XML в PHP, необходимо настроить PHP с ключом -with-xml.

    Разработку Expat 2.0 в настоящее время ведет Кларк Купер (Clark Cooper). За дополни- тельной информацией обращайтесь по адресу http://expat.sourceforge.net .

    На первый взгляд задача обработки данных XML на РHР (или на любом другом языке) выглядит устрашающе, но на самом деле большая часть работы выполняется за вас стандартными средствами PHP. Вам остается лишь определить новые функции для своих DTD и затем применить их в несложном процессе обработки кода XML.

    Прежде чем переходить к рассмотрению функций PHP, предназначенных для работы с XML, необходимо познакомиться с основными компонентами документа XML. Это поможет вам лучше понять, почему эти функции являются незаменимой частью любой программы обработки XML-кода. На самом общем уровне документ XML содержит компоненты девяти видов:

    • открывающие теги;
    • атрибуты;
    • символьные данные;
    • закрывающие теги;
    • инструкции по обработке;
    • синтаксические объявления;
    • внешние ссылки на сущности;
    • необработанные сущности;
    • прочие компоненты (комментарии, объявления XML и т. д.).

    Для эффективной обработки документов XML необходимо определить пользовательские функции-обработчики (handlers), обрабатывающие каждый из перечисленных компонентов. Определенные функции подключаются к процессу обработки XML стандартными средствами PHP. Общий процесс обработки кода XML в PHP состоит из пяти этапов:

    1. Определите пользовательские функции. Разумеется, если вы собираетесь постоянно работать с документами XML, эти функции достаточно написать всего один раз и в дальнейшем лишь вносить в них необходимые изменения.
    2. Создайте анализатор (parser) кода XML, который будет использоваться для обработки документа. Анализатор создается вызовом функции xml_parser_create( ).
    3. При помощи стандартных функций зарегистрируйте свои функции в анализаторе XML.
    4. Откройте файл XML, прочитайте содержащиеся в нем данные и передайте их анализатору XML. Обработка данных выполняется простым вызовом xml_parse( )! В процессе своей работы эта функция обеспечивает косвенный вызов всех определенных вами обработчиков.
    5. Уничтожьте анализатор XML, чтобы освободить задействованные им ресурсы.

    Задача решается функцией xml_parser_free( ). Смысл всех перечисленных этапов разъясняется в следующем разделе.

    Подключение пользовательских функций к обработке XML

    В PHP существует восемь стандартных функций для регистрации пользовательских функций, обрабатывающих различные компоненты документов XML.

    Следует помнить, что вы обязательно должны определить все пользовательские функции; в противном случае произойдет ошибка. В этом разделе перечислены все стандартные функции регистрации и приведены спецификации всех пользовательских функций.

    Функция регистрирует пользовательскую функцию для работы с символьными данными. Синтаксис:

    int xml_set_character data_handler(int анализатор, string обработчик_символьных_данных)

    Первый параметр определяет анализатор XML, а второй — имя пользовательской функции, используемой при обработке символьных данных. Определение функции-обработчика должно выглядеть так:

    function обработчик_символьных_данных (int анализатор, string данные) <

    Первый параметр определяет анализатор XML, а второй — символьные данные, подлежащие обработке.

    Функция регистрирует пользовательскую функцию для всех незарегистрированных компонентов документа XML. В частности, к числу таких компонентов относятся пролог XML и комментарии. Синтаксис:

    int xml_set_default_handler(int анализатор, string обработчик_по_умолчанию)

    Первый параметр определяет анализатор XML, а второй — имя пользовательской функции, используемой по умолчанию. Определение функции-обработчика должно выглядеть так:

    function обработчик_по_умолчанию (int анализатор, string данные) <

    Первый параметр определяет анализатор XML, а второй — символьные данные, подлежащие обработке.

    Функция регистрирует пользовательские функции для обработки открывающих и закрывающих тегов элементов. Синтаксис:

    int xml_set_element_handler(int анализатор, string обработчик_открывающих_тегов, string обработчик_закрывающих_тегов)

    Первый параметр определяет анализатор XML. Второй и третий параметры определяют имена функций, используемых для обработки, соответственно, открывающих и закрывающих тегов. Определение обработчика открывающих тегов должно выглядеть так:

    function обработчик_открывающих_тегов (int анализатор, string имя_тега,

    Первый параметр определяет анализатор XML, второй — имя открывающего тега для анализируемого элемента, а третий содержит массив атрибутов соответствующего тега.

    Обработчик закрывающих тегов определяется следующим образом:

    function обработчик_закрывающих_тегов (int анализатор, string имя_тега) <

    Первый параметр определяет анализатор XML, второй — имя закрывающего тега для анализируемого элемента.

    Функция регистрирует пользовательскую функцию для обработки внешних ссылок на сущности. Синтаксис:


    int xml_set_external_entity_ref_handler(int анализатор, string обработчик_внешних_ссылок)

    Первый параметр определяет анализатор XML, а второй — имя пользовательской функции, используемой при обработке внешних ссылок. Определение функции-обработчика должно выглядеть так:

    function обработчик_внешних_ссылок (int анализатор, string ссылка, string база. string системный_идентификатор, string открытый_идентификатор) <

    Первый параметр определяет анализатор XML. Второй параметр определяет имя ссылки, четвертый — системный идентификатор ссылки на сущность, а пятый — открытый идентификатор ссылки. Третий параметр, база, в настоящее время не используется, однако его объявление все равно обязательно.

    Функция регистрирует пользовательскую функцию для обработки синтаксических объявлений. Синтаксис:

    int xml_set_notation_decl_handler(int анализатор, string обработчик_синтаксических_обьявлений)

    Первый параметр определяет анализатор XML, а второй — имя пользовательской функции, используемой при обработке синтаксических объявлений. Определение функции-обработчика должно выглядеть так:

    function обработчик_синтаксических_обьявлений (int анализатор, string ссылка, string база, string системный_идентификатор, string открытый_идентификатор) <

    Первый параметр определяет анализатор XML. Второй параметр определяет имя объявления, четвертый — системный идентификатор, а пятый — открытый идентификатор объявления. Третий параметр, база, в настоящее время не используется, однако его объявление все равно обязательно.

    Функция ассоциирует анализатор XML с некоторым объектом. Синтаксис:

    void xml_set_object(int анализатор, object &о6ъект)

    Первый параметр определяет анализатор XML, а второй содержит ссылку на объект, методы которого будут использоваться для обработки компонентов XML. Таким образом, функция xml_set_object связывает анализатор с объектом. Как правило, она вызывается в конструкторе объекта перед определениями функций-обработчиков:

    // Связать анализатор с объектом

    . Определения функций-обработчиков startTag. endTag. characterData и т.д. .

    В порядке эксперимента попробуйте закомментировать вызов xml_set_object( ). Вы увидите, что при выполнении этого фрагмента выводятся сообщения об ошибках, в которых говорится о невозможности обращения к методам объекта.

    Функция регистрирует пользовательскую функцию для работы с Pi-инструкциями.

    int xml_set_processing_instruction_handler(int анализатор, string обработчик_инструкций)

    Первый параметр определяет анализатор XML, а второй — имя пользовательской функции, используемой при обработке Pi-инструкций. Определение функции-обработчика должно выглядеть так:

    f unction обработчик_инструкций (int анализатор, string приложение, string инструкция) <

    Первый параметр определяет анализатор XML, второй — имя приложения, выполняющего инструкции, а третий — инструкцию, передаваемую приложению.

    Функция регистрирует пользовательскую функцию для необработанных внешних ссылок на сущности. Синтаксис:

    int xml_set_external_entity_ref_handler(int анализатор, string обработчик_внешних_ссылок)

    Первый параметр определяет анализатор XML, а второй — имя пользовательской функции, используемой для обработки необработанных внешних ссылок. Определение функции-обработчика должно выглядеть так:

    function обработчик_внешних_ссылок (int анализатор, string сущность, string база, string системный_идентификатор. string открытый_идентификатор, string имя_объявления) <

    Первый параметр определяет анализатор XML. Второй параметр определяет имя ссылки, четвертый — системный идентификатор ссылки на сущность, а пятый — открытый идентификатор ссылки. Третий параметр, база, в настоящее время не используется, однако его объявление все равно обязательно. Наконец, последний параметр определяет имя синтаксического объявления.

    На этом завершается наше краткое знакомство с обработчиками и функциями регистрации. Впрочем, для эффективной обработки документов XML вам понадобятся и другие функции. В следующем разделе представлены остальные функции PHP, связанные с обработкой кода XML.

    Функции обработки кода XML

    Хотя реализация всех функций-обработчиков не обязательна (документы XML не обязаны содержать элементы всех типов), по крайней мере три функции должны присутствовать во всех сценариях, работающих с XML.

    Перед обработкой документа XML необходимо предварительно создать анализатор. Синтаксис:

    int xml_parser_create([stnng кодировка])

    Необязательный параметр определяет кодировку исходного текста. В настоящее время поддерживаются три варианта кодировки:

    • UTF-8;
    • US-ASCII;
    • ISO-8859-1 (используется по умолчанию).

    По аналогии с тем, как функция fopen( ) возвращает манипулятор открытого файла, функция xml_parser_create( ) также возвращает манипулятор, используемый для вызова различных функций в процессе обработки XML. При одновременной обработке нескольких документов можно создать сразу несколько анализаторов.

    Функция xml_parse( ) выполняет обработку документа XML. Синтаксис:

    int xml_parse(int анализатор, string данные [int завершение])

    Первый параметр определяет анализатор XML (используется значение, возвращаемое при вызове xml_parser_create( )). Если необязательный параметр завершение равен TRUE, передаваемый фрагмент данных является последним. Как правило, это происходит при достижении конца обрабатываемого файла.

    Функция освобождает ресурсы, выделенные для работы анализатора. Синтаксис:

    int xml_parser_free(int анализатор)

    Параметр функции определяет анализатор XML.

    Другие полезные функции

    В PHP также существуют другие функции, упрощающие процесс обработки кода XML.

    Функция преобразует данные в кодировку ISO-8859-1. Предполагается, что преобразуемые данные находятся в кодировке UTF-8. Синтаксис:

    string utf8_decode(string данные)

    Параметр данные содержит преобразуемые данные в кодировке UTF-8.

    Функция преобразует данные из кодировки ISO-8859-1 в кодировку UTF-8. Синтаксис:

    string utf8_decode(string данные)

    Параметр данные содержит преобразуемые данные в кодировке ISO-8859-1.

    Функция xm1_get_error_code( ) получает код ошибки, возникшей в процессе обработки XML. Код ошибки передается функции xml_error_string( ) (см. ниже) для интерпретации. Синтаксис:

    int xml_error_code(int анализатор)

    Параметр функции определяет анализатор XML. Пример использования приведен ниже, в описании функции xml_get_current_line_number( ).

    Ошибкам, возникающим в процессе анализа кода XML, присваиваются числовые коды. Функция xml_error_string( ) возвращает текстовое описание ошибки по ее коду. Синтаксис:

    string xml_error_string(int код)

    В параметре функции передается код ошибки (вероятно, полученный при вызове функции xml_get_error_code( )). Пример использования функции приведен ниже, в описании функции xml_get_current_line_number( ).

    Функция возвращает номер текущей строки, обрабатываемой анализатором XML. Синтаксис:

    int xml_get_current_line_number(int анализатор)


    Параметр функции определяет анализатор XML. Пример использования функции:

    while ($line — fread($fh. 4096)) :

    if (! xml_parse($xml_parser. $line. feof($fh)));

    print «Error! [Line Sline_number]: $err_string»;

    Например, если ошибка была обнаружена в шестой строке файла, определяемого манипулятором $fh, сообщение будет выглядеть примерно так:

    Error! [Line 6]:mi snatched tag

    Функция xml_get_current_colunin_number( ) может использоваться в сочетании с xml_get_current_line_number( ) для определения точного местонахождения ошибки в документе XML. Синтаксис:

    int xml_get_current_column_number(int анализатор)

    Параметр функции определяет анализатор XML. Давайте усовершенствуем предыдущий пример:

    while ($line = fread($fh. 4096)) :

    if (! xml_parse($xml_parser, $line, feof($fh))):

    print «Error! [Line $line_nuimber, Column $column_number]: $err_string»;

    Например, если ошибка была обнаружена в шестой строке файла, определяемого манипулятором $fh, сообщение будет выглядеть примерно так:

    Error! [Line 6 Column 2]:mismatched tag

    Параметры анализатора XML

    В настоящее время в PHP поддерживаются два параметра, влияющих на работу анализатора XML:

    • XML_OPTION_CASE_FOLDING — автоматическое преобразование имен тегов к верхнему регистру;
    • XML_OPTION_TARGET_ENCODING — кодировка документа на выходе анализатора XML. В настоящее время поддерживаются кодировки UTF-8, ISO-8859-1 и US-ASCII.

    Для получения текущих значений и модификации этих параметров применяются, соответственно, функции xml_parser_get_option( ) и xml_parser_set_option( ).

    Функция xml_parser_get_option( ) получает текущее значение параметра анализатора XML. Синтаксис:

    int xml_parser_get_option(int анализатор, int параметр)

    Первый параметр функции определяет анализатор XML, а второй — имя интересующего вас параметра. Пример:

    $setting = xml_parser_get_option($xml_parser, XML_OPTION_CASE_FOLDING);

    print «Case Folding: $setting»;

    Если параметру XML_OPTION_CASE_FOLDING не присваивалось другое значение, функция вернет значение по умолчанию. В этом случае будет выведен следующий результат:

    Функция xml_parser_set_option() задает значение параметра анализатора XML. Синтаксис:

    int xml_parser_set_option(int анализатор, int параметр, mixed значение)

    Первый параметр функции определяет анализатор XML, второй — имя интересующего вас параметра, а третий — его новое значение. Пример:

    $setting = xml_parser_set_option($xml_parser, XML_OPTION_TARGER_ENCODING.»UTF-8″):

    В результате выполнения этой команды выходная кодировка документа изменяется с ISO-8859-1 на UTF-8.

    Преобразование XML в HTML

    Предположим, у вас имеется документ XML bookmarks.xml, содержащий список ссылок. Он выглядит примерно так:

    Epicurious is a great online cooking resource, providing tutorials.

    recipes, forums and more.

    Допустим, вы хотите преобразовать bookmarks.xml и вывести его содержимое в формате, совместимом с форматом браузера вашего компьютера. Программа, приведенная в листинге 14.3, преобразует файл к нужному формату.

    Листинг 14.3. Преобразование XML в HTML

    VAR $xmlparser: VAR $tagcolor =»#800000″;

    VAR $datacolor =»#0000ff»;

    xml_set_element_handler($this->xmlparser, «startTag», «endTag»);

    // Функция отвечает за обработку всех открывающих тегов.

    function startTag($parser, $tagname, $attributes) <

    print » tagcolor\» face=\»arial,

    // Функция отвечает за обработку всех символьных данных.

    function characterData($parser. $characterData) <

    print » datacolor\» face=\»arial,

    // Функция отвечает за обработку всех закрывающих тегов.

    function endTag(Sparser, $tagname) <

    print » tagcolor\» face=\»arial, verdana\»>
    «;

    // Обработать файл XML

    while ( $line = fread($fp. 4096) ) :

    // При возникновении ошибки прервать обработку // и вывести сообщение об ошибке.

    if ( ! xml_parse($this->xmlparser, $line, feof($fp))) :

    die(sprintf(«XML error: %s at line %d»,

    // Открыть файл XML для обработки

    $xml_file = «bookmarks. xml»;

    $fp = f open ($xml_flie, «r»);


    // Создать новый объект

    $xml_parser = new XMLHTML;

    В результате преобразования файл bookmarks.xml выводится в браузере в следующем виде:

    Epicurious is a great online cooking resource,

    providing tutorials, recipes, forums and more.

    Конечно, результат не такой уж впечатляющий — мы всего лишь добились, чтобы файл XML отображался в браузере. Внеся небольшие изменения в листинг 14.3, можно преобразовать URL в работающие гиперссылки, оформить данные между парой тегов . жирным шрифтом и т. д. Как видно из листинга 14.3, я использую шрифт двух разных цветов, чтобы продемонстрировать возможность форматирования текста в браузере.

    Несколько слов о PHP и XML

    В этой главе мы познакомились с XML и различными функциями PHP, предназначенными для обработки документов в формате XML. Поскольку основной темой книги является PHP, я описал лишь одну из трех спецификаций стандарта XML и не упомянул о том, как работают XSL и XLL. Конечно, полноценное отделение содержания от представления требует использования всех трех компонентов или по меньшей мере XML и XSL.

    К сожалению, на момент написания книги PHP еще не обладал возможностями, которые бы позволяли работать с XML исключительно средствами PHP. Конечно,

    возможности PHP продолжают расширяться, и в будущем эта проблема обязательно будет решена.

    Особого внимания в этой области заслуживает XSL-процессор Sablotron, разработанный компанией Ginger Alliance Lts. (http://www.gingerall.com). 12 октября 2000 года было объявлено о том, что PHP 4.03 отныне распространяется с модулем расширения Sablotron для платформ Linux и Windows. Обязательно проследите за дальнейшим развитием событий.

    Итоги

    В этой главе был изложен довольно обширный материал, касающийся XML и возможностей обработки кода XML в PHP. Глава начинается с краткой истории языков разметки. Читатель знакомится с XML и его основными преимуществами, после чего приводится сводка синтаксических конструкций языка. Оставшаяся часть главы посвящена стандартным функциям PHP для работы с кодом XML. В завершение приводятся примеры использования PHP для обработки и вывода данных XML. В частности, рассматриваются следующие вопросы:

    • краткое описание языков разметки текста;
    • SGML;
    • общие сведения о XML;
    • синтаксис XML;
    • описание типа документа (DTD);
    • PHP и XML.

    В главе 15 рассматриваются две перспективные технологии, JavaScript и СОМ (Component Object Model), и возможности их использования в PHP.

    Как конвертировать XML в массив в PHP?

    Я хочу конвертировать ниже XML в массив PHP. Любые предложения о том, как я могу это сделать?

    Решение

    Другой вариант — расширение SimpleXML (я полагаю, оно входит в стандартную комплектацию большинства установок php.)

    Синтаксис выглядит примерно так для вашего примера

    Другие решения

    Преобразование строки XML ( $buffer ) в упрощенный массив, игнорирующий атрибуты и группирующий дочерние элементы с одинаковыми именами:

    Если вы также хотите иметь атрибуты, они доступны через JSON-кодирование / декодирование SimpleXMLElement. Часто это самое простое и быстрое решение:

    Обратите внимание, что все эти методы работают только в пространстве имен документа XML.

    Удивлен никто не упомянул xml_parse_into_struct :

    Метод, используемый в принятых ответах, сбрасывает атрибуты при обнаружении дочерних элементов только с текстовым узлом. Например:

    Мое решение (и я хотел бы отдать должное здесь, потому что я уверен, что я кое-что адаптировал):

    // Преобразование XML в массив и SOAP XML в массив

    Взаимодействие PHP и XML посредством DOM XML

    Взаимодействие PHP и XML посредством DOM XML

    Что происходит, если взаимодействие PHP и XML осуществляется с помощью объектной модели стандарта DOM ? Модуль DOM XML определяет в PHP несколько классов, таких как DomNode , DomDocument , DomElement , DomText и DomAttribute , большинство из которых идут из ядра стандарта DOM . Почти для всех классов (в частности, для перечисленных выше) класс DomNode является родительским , поэтому его свойства и методы наследуются всеми остальными классами.

    Если рассмотреть произвольный XML -документ, то классу DomDocument будет соответствовать сам этот документ, классу DomElement – каждый XML -тег, классу DomAttribute – атрибуты тегов, а классу DomText – содержание XML- элементов . В то же время классу DomNode будет соответствовать каждый из перечисленных элементов XML -документа.

    Рассмотрим коллекцию, содержащую описания персон. Если каждую из них мы описываем с помощью таких характеристик, как фамилия, имя, дата рождения и электронный адрес, то структура коллекции « Личности », где хранится информация обо всех известных нам персонах, может быть представлена следующим образом.

    В дальнейшем, приводя примеры, мы будем использовать этот файл.

    Нам необходимо научиться читать, добавлять, изменять и искать информацию, находящуюся в XML -файлах.

    Перевод данных XML-файла в объекты и классы PHP

    Первое, что нужно сделать, если мы хотим работать с XML -данными в PHP при помощи расширения DOM XML , это перевести имеющиеся данные в объекты и классы DOM . Это можно сделать несколькими способами.


      С помощью функции domxml_open_mem .

    Такие функции, как domxml_open_mem() и domxml_open_file() , как правило, нужно вызывать перед вызовом любых других функций, связанных с расширением DOM .

    Эти функции преобразуют XML -файл в дерево объектов. К таким объектам можно обращаться с помощью различных методов. В частности, для выделения корневого элемента используется метод DomDocument->document_element() .

    Еще существует функция domxml_new_doc(string version) , которая создает новый пустой XML -документ. Ее параметром является номер версии создаваемого документа. Но ее мы касаться не будем, а будем считать, что XML -файл уже создан.

    Итак, каждому элементу 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 -файлов, тоже становятся узлами.

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

    Тогда в наш предыдущий пример вставим (после вывода на экран полученных массивов) строчку для поиска электронного адреса Ивана Иванова.

    Добавление новых элементов в XML-документ

    Далее разберем задачу, как можно добавить в нашу базу данных новую личность средствами php.

    Сначала нужно скопировать описание личности (считаем, что все личности описываются с помощью стандартного набора характеристик, как в файле persons.xml ). Это делается с помощью метода DomNode->clone_node() . Таким образом, мы клонируем элемент

    и все его внутренние элементы (содержание тегов не копируется).

    Потом можно установить какие-нибудь значения для элементов описания личности. Например, задать имя человека, дату его рождения и т.п. В конце нужно записать полученное описание личности в качестве потомка корневого элемента в дерево DOM с помощью метода DomNode->append_child(new_node) , где в качестве параметра передается созданный объект (новый узел).

    В PHP до версии 4.3 перед добавлением потомка к узлу с помощью данной функции этот потомок сначала копировался. Таким образом, новый узел являлся новой копией, которая могла изменяться без изменения узла, переданного как параметр в эту функцию. В более поздних версиях PHP новый узел удаляется из существующего контекста, если он уже есть в дереве. Такое поведение соответствует спецификациям W3C.

    Для удаления узла можно воспользоваться методом, применив его к узлу, который требуется удалить, т.е. DomNode->unlink_node() .

    Пример 14.5. Добавление описания новой личности в каталог

    Мастер Йода рекомендует:  Внешнее продвижение сайта уроки поисковой оптимизации
    Добавить комментарий