XML-технологии Лекция 6 Технология DOM DOM DOM — Document Object Model — объектная модель документа, стандартизованная консорциумом W3C DOM — программный интерфейс доступа к структуре и содержимому размеченных документов для создания, ведения и анализа структуры и контента DOM — кэш для хранения экземпляра XML-документа Дерево DOM DOM создает в памяти древовидную версию документа из XML-источника данных Стандарты DOM Уровень (level) — версия DOM-спецификации от W3C Типы узлов DOM Наименование Document DocumentFragment Element Attr Text Comment CDATASection ProcessingInstruction Entity EntityReference DocumentType Notation Описание Корень древовидной структуры DOM Набор элементов, относящийся к дереву DOM или подготовленный для добавления к его структуре Элемент документа Атрибут элемента документа Текстовое содержимое элементов и значения атрибутов Комментарий в документе Раздел CDATA Инструкция по обработке Сущность, объявленная в разделе DTD Ссылка на сущность из раздела DTD Заголовок DTD-схемы документа Нотации, объявленные в разделе DTD Типы узлов DOM. Пример Document Element Студенты-атр DocumentFragment Element студент Attr код Element сдача оценка Attr 5 дата рейтинг Attr объем Element сдача Element назв объем код Attr Attr Attr Text оценка Text Attr дата p03 Text Attr 120 Attr p04 Attr Attr Text Text Базы данных 140 Text объем 25-янв Text Text Element сдача 11-янв Element код назв объем код Attr Attr Attr Attr 10 Text Text Text Attr p01 Text Text Attr 120 дата Attr Петров Теория систем оценка предмет Text s02 Text Attr назв 3 рейтинг Element Text Attr фио предмет Text дата Attr 20 Element сдача Криптография оценка предмет Attr Text Attr код 4 21-янв Element назв Иванов Element студент Text предмет код Attr фио Text s01 p02 Text Attr Attr Text Text Матлогика 170 Text 5 15-янв Text Text Способы применения DOM DOM на сервере URL с параметрами запроса Клиент Веб-сервер Серверные сценарии DOM Браузер HTML-страницы Экземпляры DOM-объектов ХML-данные DOM на клиенте Клиент URL с параметрами запроса Серверные сценарии Браузер HTML-страницы DOM Экземпляр DOM-объекта Веб-сервер Клиентские сценарии ХML-данные Создание объекта DOM Основной объект — Document PHP — модуль DOM XML, класс DOMDocument $dom = new DOMDocument (); $dom = new DOMDocument ('1.0'); Загрузка документа в DOM Варианты: Загрузка из файла Загрузка из строки Загрузка из потока В PHP-классе DomDocument 2 метода: Load LoadXML Примеры $dom->load ('СтудАтр.xml'); $textXML = "<СтудАтр> <студент код = 's01' фио = 'Иванов' рейтинг = '20' кафедра = 'АСУ'><сдача оценка = '4' дата = '25-дек'> <предмет код = 'p01' название = 'Теория систем' цикл = 'ОПД' объем = '120' кафедра = 'АСУ'/> </сдача></студент></СтудАтр>«; $dom -> loadXML ($textXML); Создание узлов DOM Этапы: Определить, что должно быть добавлено в дерево, и создать соответствующий новый узел Указать, куда в дереве должен быть помещен новый узел, и выполнить добавление узла Методы объекта Document createElement — создание элемента createAttribute — создание атрибута createTextNode — создание текстового узла createCDATASection — создание секции CDATA сreateComment — создание комментария Расположение нового узла в дереве: Привязка к существующему узлу дерева Привязка к отношению иерархии между узлами Создание узлов DOM с помощью PHP createProcessingInstruction: $pi = $dom -> createProcessingInstruction ("xml", "version = '1.0' encoding = 'windows-1251'"); сreateElement: $student = $dom -> createElement ("студент"); сreateAttribute: $fio = $dom -> createAttribute ("фио"); $fio -> Value = "Иванов"; setAttribute: $student-> setAttribute ("фио", "Иванов"); appendChild $student -> appendChild ($kod); insertBefore $student -> insertBefore ($kaf, $reit); Удаление узлов DOM removeChild: $xml -> removeChild ($xml -> documentElement); removeAttribute $stud = $xml -> getElementsByTagName ("студент") -> item (0); $stud -> removeAttribute ('фио'); removeAttributeNode $stud = $xml -> getElementsByTagName ("студент") -> item (0); $fio = $stud -> getAttributeNode ("фио"); $stud -> removeAttributeNode ($fio); removeAttributeNS -1$stud = $xml -> getElementsByTagName ("студент") -> item (0); $stud -> removeAttributeNS ('http:asu', 'фио'); -2$stud = $xml -> getElementsByTagName ("студент") -> item (0); $sdacha = $stud -> getElementsByTagName ("сдача") -> item (0); $stud -> removeChild ($sdacha); Редактирование узлов DOM cloneNode — копирование узла: $clone = $student -> cloneNode (true); replaceChild — замена узла дерева в DOM: $dom -> replaceChild ($clone, dom -> DocumentElement); removeChild — удаление узла дерева в DOM: $student -> removeChild (); removeAttribute и removeAttributeNode — удаление атрибутов Обход узлов дерева DOM nodeType — определение типа узла: Node -> nodeType tagName — имя элемента, name — имя атрибута removeChild — удаление узла дерева в DOM: $student -> removeChild (); removeAttribute и removeAttributeNode — удаление атрибутов Обход узлов дерева DOM parentNode — предок контекстного узла: firstChild — первый дочерний узел: $node -> previousSibling -> tagName; nextSibling — узел, следующий за контекстным в иерархии предка: $node -> lastChild -> tagName; previousSibling — узел, предыдущий контекстному в иерархии предка: $node -> firstChild -> tagName; lastChild — последний дочерний узел: $node -> parentNode -> tagName; $node -> nextSibling -> tagName hasAttributes — проверка наличия атрибутов hasChildNodes — проверка наличия дочерних узлов XPath-адресация PHP-класс DOMXPath: $xpath = new DOMXPath ($dom); Запросы: query: $query1 = "//студент [@фио = 'Иванов']/сдача [предмет/@название = 'Базы данных']/@оценка"; echo $xpath -> query ($query1) -> item (0) -> value; evaluate: $query2 = "count (//студент [@фио = 'Иванов']/сдача)"; echo $xpath -> evaluate ($query2, $dom); getElementsByTagName: $result = $dom -> getElementsByTagName ("студент"); XSL-трансформация с помощью DOM Базовый класс в PHP — XsltProcessor: Загрузка таблицы стилей— метод Load: $xsl = new DomDocument; $xsl -> load ("stylesheet.xsl"); Привязка таблицы стилей — метод importStylesheet: $xp = new XsltProcessor(); $xp->importStylesheet($xsl); Преобразование: transformToXml: transformToUrl: echo $xp -> transformToXml ($xml); $xp -> transformToURI ($xml, 'file:///result.html'); transformToDoc: $result = $xp -> transformToDoc ($xml); echo $result -> saveXML ();