Работа с XML-документами в Sybase Adaptive Server Enterprise

Александр Барышев

Поддержка XML в ASE

Стратегия хранения XML-документов

   Размещение документов поэлементно

   Размещение документов целиком

   Гибридный подход

Понятие XQL

   Операторы уровня иерархии ‘/’ и ‘//’

   Оператор фильтра “[]”

Реализация XQL в ASE 12.5

   Метод parse()

   Метод query()

Интеграция SQL с XQL в ASE 12.5

 

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

Именно поэтому крупнейшие поставщики СУБД добавили в свои SQL-серверы наборы компонентов, утилит и интерфейсов для работы с XML-документами, то есть создали своего рода программную инфраструктуру, которая позволяет объединить реляционную модель баз данных с иерархической моделью XML, упростить способ передачи информации в Интернет и хранение готовых XML-документов.

А теперь рассмотрим, как реализована поддержка XML во флагманской СУБД Sybase — Adaptive Server Enterprise (ASE).

Поддержка XML в ASE

Поддержка XML введена в ASE начиная с версии 12.0. Она включает в себя хранение и обработку XML-документов не только со стороны клиента, но и на сервере. Встроенная в сервер виртуальная Java-машина с помощью методов специального Java-класса Jxml позволяет выполнять анализ XML-документа и совершать над ним базовые операции.

В новую версию ASE 12.5, начало коммерческой реализации которой намечается в середине июня, добавлена возможность хранить синтаксически разобранные документы в полях таблицы типа image. Введен процессор языка XQL (XML query language) для обработки XML.

Ниже мы расскажем обо всех возможностях обеих версий для работы с XML.

В начало В начало

Стратегия хранения XML-документов

АSE хранит XML-документы в полях типа char или varchar (если размер документа небольшой), в полях типа Java-класс, в полях Image или Text. Существуют три подхода для размещения XML-документов:

  1. Размещение документов поэлементно.
  2. Размещение документов целиком.
  3. Гибридный подход.
В начало В начало

Размещение документов поэлементно

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

Достоинством использования указанного подхода является поддержка ссылочной целостности на уровне базы данных и использования языка Transact-SQL для формирования и разбора XML-документа (применение функций SUBSTR, CONVERT и т.д.), а недостатком — необходимость проведения синтаксического анализа XML-документа каждый раз при его сборке/разборке.

В начало В начало

Размещение документов целиком

Документ целиком хранится в таблице, содержащей одну колонку типа image или text. Такой способ хранения документов подходит для тех случаев, когда их содержание статично, а любое обновление сводится к перезаписи в базе данных. Типичные примеры указанных документов — статьи, каталоги, прайс-листы и т.п., то есть документы в самом обычном значении этого слова, которые и хранятся в базе данных, и извлекаются по запросу целиком.

Для хранения синтаксически разобранных (проанализированных) документов необходимо использовать поля типа Image, поскольку в случае, если документ хранится в поле типа text, то ASE 12.5 будет автоматически производить анализ документа при обращении к нему.

Достоинство этого подхода — быстрый возврат по запросу законченного XML-документа. Недостаток состоит в том, что на поиск необходимого документа затрачивается длительное время.

В начало В начало

Гибридный подход

Гибридный подход предусматривает создание уникального ключевого поля в таблице для каждого XML-документа. Это обеспечивает быстрый доступ к необходимому документу.

В начало В начало

Понятие XQL

Для работы с XML-документами в ASE реализован интерфейс языка XQL (XML Query Language).

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

Это достаточно краткий и понятный язык, наиболее привлекательный для современных СУБД. Рассмотрим некоторые из его операторов, которые будут использоваться в примерах, приводимых в данной статье.

В начало В начало

Операторы уровня иерархии ‘/’ и ‘//’

Конструкция /bookstore/book/title позволяет получить новый XML-документ, содержащий в себе список названий всех книг, которые хранятся на складе. Аналогичный документ вернет конструкция /bookstore//titlе.

В начало В начало

Оператор фильтра “[]”

Этот оператор позволяет создать новый документ, содержащий в себе только необходимое подмножество данных:

/bookstore/book[author/first-name = ‘Mary’]/title 

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

Полное описание XQL можно получить по адресу http://www.w3.org/TandS/QL/QL98/pp/xql.html/.

В начало В начало

Реализация XQL в ASE 12.5

Как уже отмечалось выше, XQL реализован в ASE в виде Java-класса xml.xql, в котором содержатся методы для анализа и выполнения запросов к XML. Этот класс может выполняться на любой виртуальной машине Java, которую поддерживает ASE, и поэтому может использоваться для написания клиентских приложений для работы с XML на рабочих местах вне сервера.

Класс содержит два основных метода:

  • Parse() — для анализа XML;
  • Query() — для выполнения запросов к XML.
В начало В начало

Метод parse()

В зависимости от передаваемых параметров этот метод имеет два варианта (рис. 1).

Parse() с параметром String — это статический метод для анализа XML и преобразования его во внутренний формат Sybase. В качестве параметра используется строковый параметр Java String:

SybXmlStream xmlStream = xml.Xql.parse(“<xml><A><B>c</B></A></xml>”);

Parse() с параметром InputStream — в качестве аргумента берется InputStream, то есть для работы с документами, поступающими извне:

URL fileURL;
fileURL = new URL(“http://xml.mysite.com/order.xml”);
InputStream inputXML;
SybXmlStream xmlStream;
inputXML = fileURL.openStream();
xmlStream = xml.Xql.parse(inputXML);

Результатом выполнения метода parse() является объект класса SybXmlStream, содержащий оптимизированную индексную структуру XML-документа внутри ASE. Такое внутреннее представление решает проблему снижения производительности сервера при одновременной работе нескольких пользователей с одним XML-документом, размер которого составляет несколько мегабайт.

В начало В начало

Метод query()

Этот метод служит для выполнения запросов к XML-документам и имеет два аргумента: строка XQL-запроса и XML-документ. Результатом выполнения является XML-документ с корневым элементом <xql_result>… </xql_result>. В зависимости от типа передаваемых параметров имеет четыре варианта (рис. 2).

Query() c параметром String — этот статический метод выполняет запрос к XML-документу, содержащемуся в строке:

String result = xml.Xql.query(“/bookstore/book/author”, “<xml> ... </xml>”);

Query() с параметром InputStream — этот метод выполняет запрос к XML-документу, который хранится в файле на диске:

FileInputStream xmlStream = new FileInputStream(“bookstore.xml”);
String result = Xql.query(“/bookstore/book/author”, xmlStream); 

или находится в Интернете (в этом случае используется объект URL):

URL xmlURL = new URL(“http://mybookstore.amazon.com/bookstore.xml”);
String result = Xql.query(“/bookstore/book/author”, xmlURL.openStream());

Query() с параметром SybXmlStream — принимает в качестве параметра объект класса SybXmlStream. Типичный сценарий использования этого варианта:

SybXmlStream xmlStream = xml.Xql.parse(“<xml>..</xml>”);
String result = xml.Xql.query(“/bookstore/book/author”, xmlStream);

Query() с параметром JXml — класс JXml применяется в текущей версии ASE 12.0 как Java-объект для хранения и работы с XML-документами. Если в базе уже имеются документы, разработанные с помощью данного класса, то работу с ними можно производить с помощью XQL:

JXml xDoc = new JXml(“<xml>...</xml>”);
String result = Xql.query( “/bookstore/book/author”, xDoc);
В начало В начало

Интеграция SQL с XQL в ASE 12.5

Над документами, хранящимися в базе данных XML, можно выполнять четыре основные операции: INSERT, DELETE, UPDATE и SELECT.

Создадим таблицу:

create table XMLDAT(.., xmldoc image,..) 

Добавим в нее документ:

insert into XMLDAT values ( .., xml.Xql.parse( “<xml><bookstore>..</bookstore></xml>”),    .. )

Удалим из таблицы все записи, содержащие XML-документы, в которых упоминается имя автора Karl:

Delete  from XMLDAT   
Where  
xml.Xql.query(“/bookstore/book[autor/first-name=‘Karl’], xmlcol ) != xml.xql.EmptyResult  

Переменная EmptyResult содержит пустой XML-документ в виде <xql_result></xql_result>.

Аналогично можно выполнить изменение документов:

update XMLDAT 
set xmldoc = xml.Xql.parse(“<xml> … … </xml>”)
Where ..

Как SQL выполняет запрос к реляционным данным, так и XQL выполняет запросы к данным, которые хранятся в XML-документе:

Select   
xml.Xql.query(“/bookstore/book[autor/first-name=‘Mary’], xmlcol )   
from XMLDAT   
Where   
             xml.Xql.query(“/bookstore/book[autor/first-name=‘Mary’], xmlcol ) != xml.xql.EmptyResult  

Приведенная конструкция оператора SELECT выбирает из таблицы все строки, где содержатся XML-документы с автором Mary, а затем формирует список книг, автором которых является Mary.

Поддержка XML в ASE позволяет разработчикам создавать эффективные решения в области обмена деловой информацией между различными приложениями. Хранение XML-документов в базе облегчает работу Web-дизайнерам, которым приходится рисовать сотни HTML-страниц с одинаковым содержанием, но с разными способами представления данных. Используя поддержу Java в ASE, можно создавать собственные классы для обработки специфических XML-документов. Все вышеописанные, а также другие решения, предлагаемые компанией Sybase, позволяют ASE стать надежной основой для построения систем электронной коммерции и создания единого информационного портала предприятия.

КомпьютерПресс 6'2001