ИСПОЛЬЗОВАНИЕ HTML В SQL SELECT ’<TABLE BORDER=1>’,’’,’’,’’ UNION ALL SELECT ’<TR>’, ’<TD>’+CompanyName+’</TD>’, ’<TD>’+CustomerID+’</TD>’, ’</TR>’ FROM Customers UNION ALL SELECT ’</TABLE BORDER=1>’,’’,’’,’’ ПРОБЛЕМЫ HTML HTML HTML не расширяем. Каждый браузер поддерживает фиксированный набор тегов, и возможности добавить новые теги не существует HTML Язык ориентирован на форматирование данных. Если изменится формат данных, которые считывает некоторая программа, то она, скорее всего, перестанет работать HTML Язык статичен. DHTML и подобные технологии смягчают этот момент, но HTML никогда не предназначался для работы с изменяющимися данными ПРОБЛЕМЫ HTML И XML HTML HTML дает только одно представление данных. Изменение представления данных оказывается более сложным, чем следует. HTML Мало семантики. Нет возможности для представления данных отличным от отображения способом XML Создан для решения проблем, связанных с ограничениями HTML. Это метаязык предназначенный для определения новых языков, которые можно использовать для обмена данными ПРОСТОЙ ПРИМЕР XML <?xml version="1.0" encoding="WINDOWS-1251"?> <tutorial> <title>"Заметки об XSL"</title> <author>Леонов Игорь Васильевич</author> </tutorial> ПРАВИЛЬНО ОФОРМЛЕННЫЙ XML-ДОКУМЕНТ Правило № 1 Все элементы должны корректно открываться, закрываться и быть вложенными. Например, это корректно: <name> Jane <address> Main Street </address> </name> Это не корректно: <name>Jane<address>123 Main </name></addess> Как и это: <name>Jane<address>123 Main</name> ПРАВИЛЬНО ОФОРМЛЕННЫЙ XML-ДОКУМЕНТ Правило № 2 XML не позволяет иметь незакрытые элементы. Так, если элементу не нужен закрывающий тэг (как в случае при отсутствии содержимого), это следует отражать при определении открывающего тэга элемента. Это можно сделать, завершая тэг символом "/". <image url="my_face.jpg" /> Почему это правило необходимо? XML-документам не нужно Определение Типа Документа (DTD – Document Type Definition). Без DTD процессор не может “понять”, нужен элементу закрывающий тэг или нет, так что по умолчанию каждый элемент должен быть закрыт тем или иным способом. ПРАВИЛЬНО ОФОРМЛЕННЫЙ XML-ДОКУМЕНТ Правило № 3 Все значения атрибутов должны заключаться в кавычки. (В конце концов, существует стандарт.) Это верно: <product version="5"> Это неверно: <product version=5> ПРАВИЛЬНО ОФОРМЛЕННЫЙ XML-ДОКУМЕНТ Правило № 4 XML чувствителен к регистру. Можно пользоваться любым регистром, но следует быть последовательным. <product> в нашем примере допустимо, в то время как <Product> или <PRODUCT> — нет. ПРАВИЛЬНО ОФОРМЛЕННЫЙ XML-ДОКУМЕНТ Правило № 5 Свободное место не игнорируется. Следующие два примера будут интерпретироваться по-разному. <title> <name>The mysterious mathematician</name> </title> <title> <name> </title> The mysterious mathematician</name> ПРАВИЛЬНО ОФОРМЛЕННЫЙ XML-ДОКУМЕНТ Правило № 6 На верхнем уровне XML-файла всегда находится один элемент. ПРАВИЛЬНО ОФОРМЛЕННЫЙ XML-ДОКУМЕНТ Это — базовые правила XML. Если документ отвечает этим требованиям, он считается правильно оформленным. Если документ этим требованиям не удовлетворяет он обработан не будет. Можно ли вообразить, что бы было, если бы это относилось и ко всем HTML-документам? Как видите, создать XML-документ предельно легко. Особенно, если уже знать HTML. ЭЛЕМЕНТЫ ИЛИ АТРИБУТЫ? Необычность XML заключается в том, что этот язык предлагает два почти эквивалентных, хотя и не совсем, способа написания фразы: "это данные". Первый способ указания значения данных поместить его во вложенный элемент, второй присвоить значению атрибута. Поскольку очевидный ответ на вопрос, когда какой из этих двух подходов является наиболее походящим, как правило, отсутствует, XML не является полностью ортогональным (в теории программирования под этим термином понимается следующее: "каждая конструкция выполняет одну вещь, и никакая другая конструкция не делает то же самое"). ЭЛЕМЕНТЫ ИЛИ АТРИБУТЫ? <inventory> <product id="500" version="5">PowerProduct</product> <product id="501" version="5">PowerProduct </product> <product id="502" version="6.01">PowerProduct</product> </inventory> <inventory> <product> <id>500</id> <version>5</version> <name>PowerProduct</name> </product> ... </inventory> ОПРЕДЕЛЕНИЕ ТИПА ДОКУМЕНТА DOCUMENT TYPE DEFINITION, ИЛИ DTD DTD позволяет указать, сколько элементов связано друг с другом. Например: <product> <id> <name> <version> </product> Один элемент обозначен как главный, а остальные — как подчиненные. Чтобы быть корректным, любой документ, содержащий эти элементы, должен поддерживать эти отношения. DTD ответственен за определение как этих отношений, так и дополнительных факторов — порядка использования элементов, типа данных, которые могут в них содержаться и пр. <!ELEMENT product (id+, name+, version?)> <!ELEMENT id (#PCDATA)> <!ELEMENT name (#PCDATA)> <!ELEMENT version (#PCDATA)> PCDATA — это резервное имя, описывающее базовые элементы и представляющее тип данных, содержащихся в элементе. Оно означает наличие символьных данных, которые могут быть подвергнуты грамматическому анализу. Есть и дополнительные способы определения содержания элемента, а также атрибутов, которые могут содержаться в элементе. ПРОСТОЙ ПРИМЕР XML и XSL <?xml version="1.0" encoding="WINDOWS-1251"?> <?xml-stylesheet type='text/xsl' href='ex01-1.xsl'?> <tutorial> <title>"Заметки об XSL"</title> <author>Леонов Игорь Васильевич</author> </tutorial> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <p><strong><xsl:value-of select="//title"/></strong></p> <p><xsl:value-of select="//author"/></p> </xsl:template> </xsl:stylesheet> ПРОСТОЙ ПРИМЕР XML и XSL <?xml version="1.0" encoding="WINDOWS-1251"?> <?xml-stylesheet type='text/xsl' href='ex01-2.xsl'?> <tutorial> <title>"Заметки об XSL"</title> <author>Леонов Игорь Васильевич</author> </tutorial> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <p><strong><xsl:value-of select="//author"/></strong></p> <p><xsl:value-of select="//title"/></p> </xsl:template> </xsl:stylesheet> ЯВЛЯЕТСЯ ЛИ XML БАЗОЙ ДАННЫХ? Если строго придерживаться определения базы данных, то «XML» – в том случае, если под этим термином подразумевается XML-документ, – базой данных не является. Хотя XML-документ содержит данные, без дополнительного программного обеспечения, которое служит для обработки этих данных, он является базой данных не в большей степени, чем любой другой текстовый файл. ЯВЛЯЕТСЯ ЛИ XML БАЗОЙ ДАННЫХ? Если говорить более широко, то есть, подразумевая под «XML» собственно XML-документ и сопровождающие XML инструменты и технологии – ответ будет звучать как «да, но». «Да», потому что XML предоставляет множество функций баз данных: хранение (XML-документ), схемы (DTDS, язык определения схем XML), язык запросов (XQL, XML-QL, QUILT и другие), интерфейсы для языков программирования (SAX, DOM) и так далее. «Но», потому что многие функции присущие классическим базам данных все же отсутствуют: эффективное хранение, индексация, обеспечение безопасности, обработка транзакций и поддержка целостности данных, многопользовательский доступ, триггеры, поддержка запросов ко многим документам и т.д. XML И SQL ИНСТРУКЦИЯ SELECT FOR XML Этот оператор предназначен для представления результирующего набора строк в виде XML-документа. Рассмотрим его синтаксис: FOR XML { RAW | AUTO | EXPLICIT } [ , XMLDATA ] [ , ELEMENTS ] [ , BINARY BASE64 ] FOR XML RAW Каждая строка представляется в виде элемента <row/>. Название поля формирует название атрибута, а значение поля – значение атрибута FOR XML AUTO Документ XML форматируется точно так же, как и при XML RAW, только название элемента, представляющего строку, заменяется на название таблицы. ПРЕДУПРЕЖДЕНИЕ SQL Server не позволяет использовать предикат GROUP BY совместно с FOR XML AUTO. FOR XML EXPLICIT Самый сложный и гибкий вариант для создания XML-документов. В этом режиме можно формировать документы практически любой формы, однако для этого сам запрос должен быть написан по определенным правилам. FOR XML EXPLICIT В данном режиме можно формировать практически любые документы. Структура результирующего XML-документа определяется непосредственно в самом запросе. Запрос может принимать очень сложный вид. Первое поле всегда называется tag и представляет собой числовой идентификатор таблицы. Вы можете указывать для него любые числовые значения. В результирующем документе он не появляется, и нужен только, чтобы определить связи между таблицами для формирования иерархического документа. Второе поле называется parent и тоже может представлять любой числовой идентификатор. Он определяет родительскую таблицу для данной таблицы и в результирующем документе также не присутствует. Если родитель отсутствует, указывается 0 или NULL. Для иерархических выборок нужно использовать несколько запросов, объединенных с помощью оператора UNION ALL. FOR XML EXPLICIT После двух обязательных полей tag и parent следуют поля, которые требуется выбрать из таблицы. Для них должен быть задан псевдоним, определяющий тип XML-узла, его название и другую информацию. Вот синтаксис этого псевдонима: ElementName ! TagNumber ! AttributeName ! Directive FOR XML EXPLICIT ElementName ! TagNumber ! AttributeName ! Directive ElementName – имя элемента, в котором будет находится элемент данного поля. Обычно здесь указывается имя таблицы. TagNumber – идентификатор таблицы, в которой находится данное поле. Одному и тому же ElementName всегда должен соответствовать один TagNumber. Он также не отображается ни в каком виде в результирующем документе, однако нужен для определения иерархических связей между таблицами. AttributeName – имя атрибута (или элемента), представляющего данное поле. FOR XML EXPLICIT ElementName ! TagNumber ! AttributeName ! Directive Directive – по существу, представляет собой тип узла. Может принимать следующие значения: element поле представляется в виде элемента xml То же самое, что element, но не выполняет трансформации текста. Например, символ меньше (<) не превращается в ссылку &lt; cdata значение поля обрамляется соответствующим образом. Имя атрибута указывать совместно с этим ключевым словом нельзя. hide id,idref,idrefs позволяет скрыть поле позволяют делать ссылки на другие элементы. Эти атрибуты имеют значение, только если создается схема данных. FOR XML EXPLICIT SELECT au_fname, au_lname, address FROM authors WHERE au_fname like 'M%' FOR XML RAW; SELECT 1 as tag, 0 as parent, au_fname as 'authors!1!fname', au_lname as 'authors!1!lname', address as 'authors!1!address' FROM authors WHERE au_fname like 'M%' FOR XML EXPLICIT; Немного исправим запрос для демонстрации возможностей директивы FOR XML EXPLICIT. select 1 as tag, 0 as parent, au_fname as 'authors!1!fname', au_lname as 'authors!1!lname!element', address as 'authors!1!!cdata‘ from authors where au_fname like 'M%' for xml explicit Вот результат: <authors lname="Green"> <fname>Marjorie</fname> <![CDATA[ 309 63rd St. #411 ]]> </authors> <authors lname="O'Leary"> <fname>Michael</fname> <![CDATA[ 22 Cleveland Av. #14 ]]> </authors><authors lname="Smith"> <fname>Meander</fname> <![CDATA[ 10 Mississippi Dr. ]]> </authors><authors lname="Greene"> <fname>Morningstar</fname> <![CDATA[ 22 Graybar House Rd. ]]> </authors> <authors lname="DeFrance"> <fname>Michel</fname> <![CDATA[ 3 Balding Pl. ]]> </authors> XMLDATA Иногда бывает полезно получить не только сами данные, но и их схему. Схема данных также записывается в формате XML. Она определяет типы элементов и атрибутов, накладывает ограничения на их значения, и вообще представляет метаинформацию, позволяющую проверить документ на действительность (validity). Существует несколько разновидностей (форматов) схем данных. SQL Server использует XDR-схемы (XML Data Reduced). Ключевое слово XMLDATA может быть использовано для всех трех режимов формирования XML-документа (raw, auto и explicit). ELEMENTS Ключевое слово, использующееся только совместно с FOR XML AUTO. При его указании поля формируются как элементы: название поля соответствует названию элемента, а значение поля – значению элемента. BINARY BASE64 Определяет, как будут выведены двоичные данные (binary data). Просмотр, изменение, удаление файлов Порча оборудования Демонтаж оборудования Установка вредоносного программного кода КОМПЬЮТЕРЫ ЧЕЛОВЕЧКИ