XML
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
XML
XML (eXtensible Markup Language) – расширяемый язык разметки,
утвержденный консорциумом W3C (World Wide Web Concorcium) в феврале
1998 г. как XML 1.0. Стандартом стал с ноября 2008 г.
Данные, называемые элементами, хранятся в XML-документе в виде
строк текста и ограничены тэгами – специальными текстовыми метками,
заключенными в символы <, >, чувствительными к регистру и фактически
отделяющими единицы данных друг от друга.
Тэги,
хотя
и
должны
подчиняться
спецификации,
являются
пользовательскими, что существенно отличает XML от HTML.
Структура XML-документа
Любой XML-документ включает следующие основные части:
Пролог (необязателен в XML 1.1);
Тело документа
Эпилог (необязателен, следует за деревом элементов).
Пример XML-документа:
1
Пролог содержит указания для анализатора XML и приложений:
1) Объявление XML (XML Declaration): версия XML (version),
кодировка символов (encoding), в которой написан документ:
UTF-8, UTF-16, Windows 1251 и т.д., автономность: standalone=
"yes"/ "no" ("yes" – игнорировать внешние декларации DTD);
2) Комментарии (например, );
3) Команды
обработки
(например,
указание
браузеру,
как
отображать XML -документ с таблицей стилей из файла *.css);
4) Символы пустых пространств;
5) Необязательное объявление DTD.
Пример типичного пролога XML-документа:
"1.0" encoding="UTF-8" standalone="yes"?>
Корректным (well-formed) называют XML-документ, соответствующий
спецификации стандарта XML.
Правильным (valid) называют XML-документ,
пролог
которого
содержит указание на описание синтаксиса данного документа и строго
соответствует ей.
W3C допускает две схемы объявления XML-документов:
1) DTD (Document Type Definition) – язык, используемый для
записи
фактических
синтаксических
нотаций
с
помощью
декларативных правил.
2) XML Schema обладает более мощными возможностями, чем DTD
и опирается на использование файлов с расширением *.xsd (XML
Schema Definition). Версия 1.1 одобрена в апреле 2012 г.
Типы данных XML-документов
2
В XML Schema есть различие между сложными типами элементов,
которые могут иметь вложенные элементы и атрибуты, и простыми типами,
которые не могу иметь вложенных элементов и атрибутов.
Есть различие и между определениями и объявлениями. Так,
определения создают новые типы элементов (простые и сложные).
Объявления же задают имена и содержимое элементов и атрибутов (простых
и
сложных),
которые
могут
использоваться
в
XML-документах,
соответствующих данной схеме.
Простые типы данных делятся на две группы:
примитивные (primitive);
выводимые (derived).
К примитивным типам данных относятся такие типы, как string,
boolean, double, decimal и др.
Выводимые типы строятся на основе примитивных типов. Некоторые
из них являются предопределенными (например, integer выводится из
decimal), и, по сути, ограничивают значения по базовому типу.
SQL/XML
SQL/XML,
или
иначе XML-Related
Specifications (Спецификации,
связанные с XML), представляет собой расширение языка SQL и является
частью стандарта ANSI/IEC SQL:2003 Part 14.
Для разработчиков SQL SQL/XML не должен вызывать затруднений,
поскольку представляет собой дополнения к языку SQL. Поскольку SQL
является
состоявшимся
языком,
то
есть
много
инструментов
и
инфраструктуры и для SQL/XML. Он позволяет создавать XML-структуры из
реляционных источников.
SQL/XML используется фирмами IBM и Oracle в своих СУБД.
3
SQL/XML определяет расширения SQL для использования XML в
сочетании с SQL. Вводятся типы данных XML наряду с несколькими
подпрограммами, функциями, а также связывание XML-в-SQL типов данных
для поддержки обработки и хранения XML в SQL-базах данных.
Спецификация SQL/XML включает в себя функции создания XMLданных. Эти функции позволяют пользователю создавать новые XMLэлементы или атрибуты с определенными значениями, например, из
реляционных таблиц. Другие функции, например, XMLCONCAT или
XMLAGG, могут быть использованы для объединения небольших XMLфрагментов в более крупные. Список доступных функций конструирования
включает в себя:
XMLELEMENT
XMLATTRIBUTES
XMLFOREST
XMLCONCAT
XMLNAMESPACES
XMLCOMMENT
XMLPI
XMLDOCUMENT
XMLAGG
и др.
SQL/XML также определяет функции, позволяющие пользователю
встраивать XQuery-выражения в SQL-запросы. Такие функции включают в
себя XMLQUERY и XMLTABLE.
Тогда как XMLQUERY возвращает значения XML-типа, функция
XMLTABLE может взять XML-данные в качестве вводных и вывести
сгенерированную реляционную таблицу. Предикаты XML-данных, как
4
например, условия поиска, могут быть выражены при помощи предиката
XMLEXISTS, обычно указывающиеся при помощи WHERE в SQL-запросе.
XQuery
Консорциум W3C к 2007 году разработал язык запросов XQuery 1.0 к
источникам данных, представленных на XML.
XQuery — язык запросов и функциональный язык программирования,
разработанный для обработки данных в формате XML, простого текста,
JSON или других предметно-специфичных форматах. XQuery использует
XML как свою модель данных. Предназначен для запроса и преобразования
коллекций структурированных и неструктурированных данных.
XQuery позиционируется как язык, предназначенный для интеграции
данных из различных источников, в том числе XML-источников, таких как
документы или WEB-сообщения и БД.
Совокупность разработанных документов отражена в целом пакете
спецификаций, которые влияют друг на друга. Так, выражения XQuery
используют спецификацию XPath.
Документы в формате XML содержат иерархии и для них характерен
внутренний порядок. Они самоописывающиеся, так как состоят из контента и
разметки – тегов, идентифицирующих контент.
Табличные структуры данных, поддерживаемые СУБД на базе SQL,
являются однородными и линейными, строки, как таковые, не упорядочены.
Различия между этими моделями данных привели к нескольким
принципиальным отличиям в соответствующих им языках запросов.
Например,
XQuery
поддерживает
выражения
пути,
что
позволяет
перемещаться по иерархической структуре XML-документа.
5
Структура спецификация XQuery
XSLT
XPointer
XPath 1.0
XQuery 1.0
XPath 2.0
XQuery 1.0 был разработан рабочей группой XML Query в составе
организации W3C. Эта работа координируется другой рабочей группой,
работающей над XSLT 2.0. Эти две группы разделяют ответственность за
XPath 2.0, входящий в состав XQuery 1.0. 3 ноября 2005 года XQuery 1.0
получил статус W3C Candidate Recommendation, а 23 января 2007 года
XQuery 1.0, одновременно с XSLT 2.0 и XPath 2.0, получил статус
официальной рекомендации (W3C Recommendation). В настоящее время
ведутся работы по развитию этого стандарта, с добавлением выражений для
свободного поиска по тексту и для внесения изменений в XML документы и
базы данных, а также для процедурных операций.
XQuery версии 3.0 принят W3C 8 апреля 2014 года.
XQuery версии 3.1 принят W3C 21 марта 2017 года.
XPath (XML Path Language) — язык запросов к элементам XMLдокумента. Разработан для организации доступа к частям документа XML в
файлах трансформации XSLT и является стандартом консорциума W3C.
XPath призван реализовать навигацию по DOM в XML. В XPath используется
компактный синтаксис, отличный от принятого в XML. В 2007 году
завершилась разработка версии 2.0, которая теперь является составной
частью языка XQuery 1.0. В декабре 2009 года началась разработка версии
2.1, которая использует XQuery 1.1.
6
XSLT (eXtensible Stylesheet Language Transformations) — язык
преобразования XML-документов. Спецификация XSLT входит в состав
XSL и является рекомендацией W3C.
При применении таблицы стилей XSLT, состоящей из набора
шаблонов, к XML-документу (исходное дерево) образуется конечное дерево,
которое может быть сериализовано в виде XML-документа, XHTMLдокумента (только для XSLT 2.0), HTML-документа или простого текстового
файла. Правила выбора (и, отчасти, преобразования) данных из исходного
дерева пишутся на языке запросов XPath.
XSLT имеет множество различных применений, в основном в области
веб-программирования и генерации отчётов. Одной из задач, решаемых
языком XSLT, является отделение данных от их представления, как часть
общей парадигмы MVC (англ. Model-view-controller). Другой стандартной
задачей является преобразование XML-документов из одной XML-схемы в
другую.
На данный момент самой популярной версией является XPath 1.0. Это
связано с отсутствием поддержки XPath 2.0 со стороны открытых библиотек.
В частности, речь идёт о LibXML, от которой зависит поддержка языка в
браузерах, с одной стороны, и поддержка со стороны серверного
интерпретатора, с другой.
XSLT разработан рабочей группой XSL Консорциума Всемирной
паутины.
Версия 1.0 была одобрена в качестве рекомендации 16 ноября 1999
года. После выхода первой версии начались работы над версией 1.1, но в
2001 году они были прекращены, а рабочая группа XSL присоединилась к
рабочей группе XQuery для совместной работы над XPath 2.0. Впоследствии
XPath 2.0 послужил основой при разработке XSLT версии 2.0.
7
Версия 2.0 была одобрена в качестве рекомендации 24 января 2007
года. Версия 3.0 была одобрена 8 июня 2017 года.
В
качестве
инструмента
выполнения
запросов
XQuery можно
использовать редактор EditiX 2010 Free Edition.
http://free.editix.com
Бесплатный редактор MS XML Notepad 2007
https://www.microsoft.com/en-us/download/details.aspx?id=7973
Типы данных XQuery
XML является основой системы типов XQuery и модели данных.
XQuery поддерживает как типизированные, так и не типизированные
данные, а для данных SQL всегда определен конкретный тип.
В XQuery нет пустых значений, поскольку в XML недостающие или
неизвестные данные пропускаются, а SQL, как известно, использует NULLзначения для представления недостающих или неизвестных значений
данных.
Примитивные типы данных, аналогичные XML Schema:
Числа, включая целые и числа с плавающей запятой
Булевы значения: true (истина) и false (ложь)
Строки символов, например, "Hello world!". Строки неизмененны
(immutable), то есть символ в строке не может быть изменен,
поскольку нет типа данных символ.
Различные
типы
для
представления
дат,
времени
и
продолжительности. Date специфицирована в формате "YYYYMM-DD",
Time
–
"hh:mm:ss",
DateTime
–
"YYYY-MM-
DDThh:mm:ss".
8
Несколько типов, связанных с XML. Например, QName – это
часть локального имени и URL, используемого в WEB.
Для извлечения данных из узлов предусмотрены функции:
fn:data() – извлекает скалярное типизированное значение из узла
типизированного XML (подключен файл *.xsd) и строку для
нетипизированного;
fn:string() – возвращает значение узла в виде строки.
Для типизации значений используют либо приведение типов, либо
специальные функции:
Явное приведение типов: $a/price cast as xs:float;
Неявное для числовых и атомарных: xs:float($a/price)
Функция
преобразования,
например,
строки
в
число:
fn:number($a/price).
Проверить возможность преобразования с получением ответа true|false
можно с помощью выражения:
$a/price castable as xs:float → true
В XQuery есть также типы данных, необходимые для представления
величин XML. Для этого используются величины узлов следующих семи
типов: элемент, атрибут, пространство имен, текст, комментарий, инструкция
обработки и документ (корень).
Это типы очень похожи на соответствующие классы DOM: Node,
Element, Comment, Attribute и так далее. В некоторых реализациях XQuery
используются объекты DOM для задания величин узлов, хотя могут
применяться и другие представления.
DOM (от англ. Document Object Model — «объектная модель документа») — это
независящий от платформы и языка программный интерфейс, позволяющий программам
9
и скриптам получить доступ к содержимому HTML-, XHTML- и XML-документов, а
также изменять содержимое, структуру и оформление таких документов.
Модель DOM не накладывает ограничений на структуру документа. Любой
документ известной структуры с помощью DOM может быть представлен в виде
дерева узлов, каждый узел которого представляет собой элемент, атрибут, текстовый,
графический или любой другой объект. Узлы связаны между собой отношениями
«родительский-дочерний».
Результатом
последовательность
вычисления
простых
выражения
величин.
XQuery
Например,
(3,
является
4,
5)
–
последовательность из 3 целых.
Многие из стандартных функций, предназначенных для работы с
узлами, возвращают последовательности.
Пример:
Функция count() принимает один аргумент
и возвращает число величин в
последовательности. Тогда выражение:
let $a:=(3,4), $b:=($a,$a), $c:=(99), $d:=(0)
return (count($a), count($b), count($c),
count($d))
равняется (2, 4, 1, 1), поскольку $b то же
самое, что и (3, 4, 3, 4)
Выражения XQuery
В XQuery любая конструкция – выражение, результатом вычисления
которого является некоторое значение.
Первичные выражения включают литералы, переменные, вызовы
функций, конструкторы и скобки для управления приоритетом операций.
Ссылка на переменную в выражении XQuery – это QName, перед которым
10
ставится знак $, например, $a. Функции вызываются с использованием
префикса "fn:" – например, fn:max((2,3)).
Логические выражения используют операции and и or для вычисления
логического значения (true или false) для операндов. Для отрицания
предусмотрена функция not().
Выражения пути – выражения XPath, определяющие местонахождение
узлов, например, элементов, атрибутов и текстовых узлов в документе.
Путь включает шаги адресации, разделяемые символом "/", и каждый
такой шаг состоит из трех частей:
оси – определяет направления движения;
условия проверки узлов (задается тип или имена узлов, которые
будут выбраны) – обязательная часть, представляющая собой
последовательность вложенных тэгов и символа "*" (дочерний
узел с любым именем, по сути, аналог element()), например:
//book/genre и //book/*;
предиката – необязательной части в квадратных скобках, внутрь
которого можно включать дополнительные условия проверки
элементов по другим осям, функции, выражения с операциями (+,
-, <, > и т.д.), например: //book[genre eq 'Computer'].
Типовые сокращения для путей адресации:
.
..
/
//
|
name
@
[n]
текущий узел
родительский узел
дочерние узлы
текущий и все дочерние узлы (//book)
набор дочерних узлов, например: $a/genre | $a/price
дочерние узлы с именем name, например: //book/author
атрибут, например: return {@a/data(@*)}
дочерний узел с номером n, например: //book[1]
11
Основные типовые сокращения для условий проверки узлов:
node() – узел любого типа;
*|element([*|name]) – узел-элемент, возможно, с именем name;
text() – текстовый узел;
attribute([@*|@name]) – узел-атрибут, возможно, с именем name.
Выражения
последовательности
конструируют,
фильтруют
и
комбинируют последовательности элементов и узлов, и они никогда не
бывают вложенными.
Предусмотрено три вида выражений последовательности:
Создание
"запятая"
(конструирование)
(1,
2,
5);
последовательности:
выражение
диапазона,
оператор
создающее
последовательность целых чисел (1 to 100).
Выражение
фильтрации последовательности,
состоящее
из
первичного выражения, за которым может следовать предикат,
фильтрующий последовательность, возвращаемую первичным
выражением, например: price < 5 and genre="Romance".
Операторы для комбинирования последовательностей, являющих
упорядоченными множествами: union или |, intersect, except.
Арифметические выражения, поддерживаемые XQuery, в порядке
возрастания приоритета:
+, - – сложение и вычитание значений;
*, div, idiv, mod – умножение, деление, целочисленное деление,
остаток.
Например, для цены книги, равной 44,95:
return {$a/price div 2, $a/price idiv 2, $a/price mod 2}
12
Результат: 22,475 22 0,95
Выражения сравнения. В XQuery предусмотрено три варианта
выражений сравнения:
сравнение значений – сравниваются два атомарных значения;
общие сравнения – сравниваются две последовательности любой
длины, и определяется, удовлетворяет ли заданному сравнению
хотя бы один элемент первой последовательности и один элемент
первой
последовательности
и
один
элемент
второй
последовательности, например: (1, 2) = (2, 3);
сравнение узлов – сравниваются два узла для определения их
идентичности или взаимного расположения в XML-документе.
сравнение значений
общие сравнения
eq
=
ne
!=
lt
<
le
<=
gt
>
ge
>=
Операция
is
<<
>>
Назначение
возвращает true, если оба операнда
являются одним узлов
возвращает true, если первый узелоперанд предшествует второму узлуоперанду в дереве документа
возвращает true, если первый узелоперанд следует за вторым узломоперандом в дереве документа
Например, следующие выражения для файла books.xml вернут true:
13
return //book[title="Maeve Ascendant"] << //book[title="Oberon's Legasy"]
return //book[title="Maeve Ascendant"] is //book[publish_date="2000-11-17"]
Основные функции:
max(), min(), count(), sum(), avg(), distinct-values(), exists(), empty(),
concat(), contains(), last(), position(), boolean(), not(), floor(), ceiling(), round(),
substring[-after|before](), string[-length](), sterts|ends-with(), doc(), document(),
collection(), @id.
Оператор запроса FLWOR
FLWOR – это сокращение от слов конструкции:
for, let, where, order by и return.
Инструкция FLWOR состоит из следующих частей.
Одно или несколько предложений FOR, которые привязывают
одну
или
несколько
переменных-итераторов
к
входным
последовательностям.
Входные последовательности также могут быть выражениями
XQuery (например, выражениями XPath). Они являются либо
последовательностями
узлов,
либо
последовательностями
атомарных значений. Последовательности атомарных значений
могут быть получены с помощью литералов или функцийконструкторов. В SQL Server нельзя использовать построенные
XML-узлы в качестве входных последовательностей.
Необязательное предложение let. Это предложение присваивает
значение
данной
переменной
для
конкретной
итерации. Присвоенное выражение может быть выражением
XQuery, например выражением XPath, и может возвращать либо
14
последовательность узлов, либо последовательность атомарных
значений.
Переменная-итератор. Дополнительно для этой переменной с
помощью ключевого слова as можно указать тип.
Необязательное
предложение
where.
Это
предложение
применяется в качестве предиката фильтра при итерации.
Необязательное
предложение order
by,
упорядочивающего
результаты запроса (ascending действует по умолчанию).
Выражение
return.
Выражение
в
предложении
return
конструирует результат, возвращаемый инструкцией FLWOR.
Примеры:
1) for $a in (1, 2), $b in (4, 5)
return
2)
for $a in doc("file:///C:/books.xml")//book
where $a/genre='Computer'
return {data($a/author)}
3) let $a:=(1,2), $b:=(4,5)
return
15
4) for $x in (1.5, 2.6, 1.9), $y in (.5, 1.6, 1.7)
where ((fn:floor($x) eq 1) and (fn:floor($y) eq 1))
return
5) for $cat at $i in ("Hoffman", "Giovanni", "Pereira")
return {$cat}
6) for $b in //catalog/book
return
{$b/title, if ($b/genre="Computer") then $b/price else $b/publish_date}
16
7) Организатор варианта
typeswitch..case..default.
Выбор варианта основан на типе
(например, имени тэга), а не на
значении. Особых преимуществ
оператор варианта перед оператором
условия не имеет, однако, может
упростить конструирование
результата.
for $a in doc("C:/books.xml")//book[price<5]/*
return typeswitch($a)
case $b as element(title) return $b
case $b as element(genre) return $b
default return ''
17
8) for $a in doc('file:///C:/books.xml')//book
for $b in doc('file:///C:/books.xml')//book
where $b/price=$a/price and $a/genre!=$b/genre
return concat($b/title, '-', $a/title)
9) Кванторы существования some и every:
{some|every} in (, …) satisfies
for $b in doc('file:///C:/books.xml')//book
where every $p in $b//genre satisfies contains ($p, "Computer")
order by xs:string($b/title)
return {$b/title, $b/author }
18
for $b in doc('file:///C:/books.xml')//book
where some $p in $b//genre satisfies contains ($p, "Fantasy")
order by xs:decimal($b/price) descending
return $b/title
10)
Пользовательские функции
Например, создание функции, подсчитывающей среднюю стоимость
книг указанного жанра:
declare function local:getAvgPrice($g as xs:string?) as xs:double?
{let $a:=fn:doc('C:/books.xml')//book /fn:avg(//book[genre=$g]/price)
return fn:distinct-values($a)};
Тогда при вызове можно использовать ее в запросах:
for $a in doc
('file:///C:/books.xml')//book[price>local:getAvgPrice('Computer')]
return {fn:string($a//title), ':', fn:string($a//price)}
19