XML eXtensible Markup Language 1. Определение типа документов (DTD) 2. Язык навигации внутри XML-документа (XPath) Определение типа (DTD) DTD — Document Type Definition Задаёт возможную структуру для некоторого типа XML-документов (т. е. задаёт один возможный язык) – как могут называться элементы – как они могут друг в друга вкладываться – какие у каждого элемента могут быть атрибуты Скачиваем XML-редактор www.firstobject.com (справа — версия 2.2.5, exe в архиве zip) Простой XML-документ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE booklist SYSTEM "books-1.dtd"> <booklist> <book> <author>А.А. Зализняк</author> <title>Древнерусские энклитики</title> <city>Москва</city> <year>2008</year> </book> <book> <author>J.K. Rowling</author> <title>Harry Potter and the Secret Chamber</title> <city>New York</city> <year>2005</year> </book> </booklist> Определение типа (DTD) <?xml version="1.0" encoding="UTF-8"?> <!ELEMENT booklist (book)*> <!ELEMENT book (author, title, city, year)> <!ELEMENT author (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT city (#PCDATA)> <!ELEMENT year (#PCDATA)> Определение типа (DTD) Содержимое элементов <!ELEMENT book (author, title, city, year)> СПИСОК ДОЧЕРНИХ ЭЛЕМЕНТОВ author, title — последовательность author|title — выбор (или — или) EMPTY — пустой элемент ANY — любая комбинация допустимых типов #PCDATA — Parsed Character Data Определение типа (DTD) Количество повторений элемента <!ELEMENT booklist (book)*> book — 1, обязательный book? — 1, необязательный (0 или 1) book+ — 1 или больше (сколько угодно) book* — 0 или больше (сколько угодно) Добавим в book необязательный элемент publisher? (издательство) Определение типа (DTD) Добавляем атрибуты В документ: <book lang="rus" bookid="AAZ01"> <author>А.А. Зализняк</author> … </book> имя атрибута В DTD: <!ATTLIST book lang CDATA #IMPLIED bookid ID #REQUIRED> Определение типа (DTD) Типы атрибутов <!ATTLIST book lang CDATA #IMPLIED bookid ID #REQUIRED genre (fiction|nonfiction) #IMPLIED> CDATA — простой текст (Character data) ID — идентификатор (значение не может повторяться) IDREF — ссылка на идентификатор другого элемента (..|..) — одно из перечисленных значений Определение типа (DTD) Значения атрибутов по умолчанию <!ATTLIST book lang CDATA "eng" bookid ID #REQUIRED genre (fiction|nonfiction) #IMPLIED> либо заданное значение, либо: #IMPLIED — атрибут необязателен #REQUIRED — атрибут обязательный #FIXED значение — значение неизменно XPath — навигация внутри документа Основные понятия: – набор узлов (nodeset) Выражение на XPath (путь) описывает набор узлов в документе – элементы – атрибуты – корень документа (корневой элемент) – абсолютный / относительный путь – родитель-дети – сиблинги (узлы одного уровня) – предки-потомки XPath — навигация внутри документа Простые выражения путь от корня (абсолютный) начинается с / фрагмент пути между двумя / — шаг по дереву (по умолчанию — от корня к листьям) в результат входят все узлы, подходящие под описанный путь /booklist ; /booklist/book/author путь без / (относительный) считается не от корня, а от текущей позиции book/author // @ любое количество шагов //book ; //author ; /booklist//author атрибут //book/@lang XPath — навигация внутри документа Простые выражения . (точка) .. (две точки) ../title * Текущий узел Родительский узел (путь от book/author к book/title) Любой узел без указания имени /booklist/* /booklist/*/* //book/@* все дети все внуки все атрибуты XPath — навигация внутри документа Выражения с условием (предикатом) условие на порядковый номер узла в дереве book[2] ; book[last()] ; book[position()<3] условие на значение элементов (путь отсчитывается от текущей позиции) book[city=“Москва”] book[price>250] условие на значение атрибутов //book[@lang=“rus”]/title Условие […] применяется к тому узлу, после которого стоит book[1]/author vs. book/author[1]