XQuery API для Java - XQuery API for Java

XQJ
Разработчики)Процесс сообщества Java
Стабильный выпуск
1.0 / 24 июня 2009 г. (2009-06-24)
ТипAPI доступа к данным
Интернет сайтJSR 225: API XQuery для Java
Общая архитектура использования драйвера XQJ для связи с базой данных XML из приложений Java.

XQuery API для Java (XQJ) относится к обычным Java API для W3C XQuery 1.0 спецификация.

XQJ API позволяет Java-программистам выполнять XQuery против XML источник данных (например, База данных XML ) при уменьшении или исключении блокировка поставщика.

XQJ API предоставляет разработчикам Java интерфейс для модели данных XQuery.[1] Его конструкция похожа на JDBC API который имеет ощущение клиент / сервер и, как таковой, хорошо подходит для серверных XML-базы данных и менее хорошо на стороне клиента XQuery процессоров, хотя "связь "- это очень незначительная часть всего API. Пользователи XQJ API могут связывать Ява ценности для XQuery выражения, предотвращающие атаки с внедрением кода.[2] Кроме того, несколько XQuery выражения могут быть выполнены как часть атомарная транзакция.

История и реализация

XQuery API для Java был разработан в Процесс сообщества Java в качестве JSR 225. У него были крупные технологические сторонники, такие как Oracle,[3][4][5][6] IBM,[5][6] BEA Systems,[7] Software AG,[8] Intel, Nokia и DataDirect.[4]

Версия 1.0 XQuery API для спецификации Java была выпущена 24 июня 2009 г.[9] вместе с JavaDocs, а эталонная реализация и TCK (комплект совместимости технологий) которым должны соответствовать поставщики внедрения.

Классы XQJ содержатся в Пакет Java javax.xml.xquery

Нет (видимых) действий по созданию версии XQJ, которая обеспечивает поддержку XQuery 3.0 или 3.1, например, путем предоставления привязок Java для дополнений к модели данных, таких как функции, массивы или карты.

Функциональность

XQJ позволяет существовать нескольким реализациям и использоваться одним и тем же приложением.

Соединения XQJ поддерживают создание и выполнение XQuery выражения. Выражения могут обновляться[10] и может включать полнотекстовый поиск.[11] XQJ представляет XQuery выражения с использованием одного из следующих классов:

  • XQExpression - выражение каждый раз отправляется процессору XQuery.
  • XQPreparedExpression - выражение кэшируется, а путь выполнения заранее определен, что позволяет эффективно выполнять его несколько раз.

XQuery выражения возвращают результирующую последовательность XDM[1] элементы, которые в XQJ представлены через XQResultSequence интерфейс. Программист может использовать XQResultSequence пройти по индивидуальному XDM[1] элементы в результирующей последовательности. Каждый элемент в последовательности имеет XDM[1] информация о типе, связанная с ним, такая как тип его узла, например элемент(), документ-узел () или атомарный тип XDM, такой как xs: строка, xs: целое число или же xs: dateTime. Информацию о типе XDM в XQJ можно получить через XQItemType интерфейс.

Атомный XQuery предметы можно легко отлить в Ява примитивы через XQItemAccessor такие методы как getByte () и getFloat (). Также XQuery элементы и последовательности могут быть сериализованы в ДОМ Узел, SAX ContentHandler, StAX XMLStreamReader и общий ввод-вывод Читатель и InputStream классы.

Примеры

Базовый пример

В следующем примере показано создание подключения к База данных XML, представляя XQuery выражение, затем обработка результатов в Ява. После обработки всех результатов соединение закрывается, чтобы освободить все связанные с ним ресурсы.

// Создаем новое подключение к базе данных XMLXQConnection conn = vendorDataSource.getConnection("myUser", "мой пароль");XQExpression expr = conn.createExpression(); // Создание многоразового объекта XQuery ExpressionXQResultSequence результат = expr.executeQuery(  "для $ n в fn: collection ('catalog') // item" +  "return fn: data ($ n / name)"); // выполняем выражение XQuery// Итеративно обрабатываем результирующую последовательностьпока (результат.следующий()) {    // Распечатываем текущий элемент в последовательности    Система.из.println("Наименование товара: " + результат.getItemAsString(ноль));}// Освобождаем все ресурсы, созданные подключениемconn.Закрыть();

Привязка значения к внешней переменной

В следующем примере показано, как Ява значение может быть привязано к внешней переменной в XQuery выражение. Предположим, что соединение conn уже существует:

XQExpression expr = conn.createExpression();// Выражение XQuery для выполненияНить es = "объявить переменную $ x как xs: integer external;" +            "для $ n в fn: collection ('catalog') // item" +            "где $ n / цена <= $ x" +            "return fn: data ($ n / name)";// Связываем значение (21) с внешней переменной с QName xexpr.bindInt(новый QName("Икс"), 21, ноль);// Выполнение выражения XQueryXQResultSequence результат = expr.executeQuery(es);// Итеративно обрабатываем результат (последовательность)пока (результат.следующий()) {    // Обработка результата ...}

Сопоставление типов данных по умолчанию

Сопоставление между Ява и XQuery Типы данных в значительной степени гибкие, однако в спецификации XQJ 1.0 есть правила сопоставления по умолчанию, отображающие типы данных, когда они не указаны пользователем. Эти правила отображения имеют большое сходство с правилами отображения, найденными в JAXB.

В следующей таблице показаны правила сопоставления по умолчанию для привязки Ява значения для внешних переменных в XQuery выражения.

Правила преобразования по умолчанию при отображении типов данных Java в типы данных XQuery
Тип данных JavaТип (ы) данных XQuery по умолчанию
логическийxs: логическое
байтxs: byte
байт[]xs: hexBinary
двойнойхз: двойной
плаватьxs: float
intxs: int
длинныйхз: длинный
короткаяхз: короткие
Булевоxs: логическое
Байтxs: byte
Плаватьxs: float
Двойнойхз: двойной
Целое числоxs: int
Длинныйхз: длинный
короткийхз: короткие
Нитьxs: строка
BigDecimalxs: десятичный
BigIntegerxs: целое число
Продолжительностьxs: dayTimeDuration если Продолжительность Состояние объекта xs: dayTimeDuration
xs: yearMonthDuration если Продолжительность Состояние объекта xs: yearMonthDuration
xs: продолжительность если Продолжительность Состояние объекта xs: продолжительность
XMLGregorianCalendarxs: date если XMLGregorianCalendar Состояние объекта xs: date
xs: dateTime если XMLGregorianCalendar Состояние объекта xs: dateTime
xs: gDay если XMLGregorianCalendar Состояние объекта xs: gDay
xs: gMonth если XMLGregorianCalendar Состояние объекта xs: gMonth
xs: gMonthDay если XMLGregorianCalendar Состояние объекта xs: gMonthDay
xs: gYear если XMLGregorianCalendar Состояние объекта xs: gYear
xs: gYearMonth если XMLGregorianCalendar Состояние объекта xs: gYearMonth
хз: время если XMLGregorianCalendar Состояние объекта хз: время
QNamexs: QName
Документдокумент-узел (элемент (*, xs: нетипизированный))
DocumentFragmentдокумент-узел (элемент (*, xs: нетипизированный))
Элементelement (*, xs: нетипизированный)
Attrатрибут (*, xs: untypedAtomic)
Комментарийкомментарий()
ОбработкаИнструкцияинструкция по обработке ()
Тексттекст()

Известные реализации

Собственные базы данных XML

Ниже приводится список Собственные базы данных XML которые, как известно, имеют XQuery API для реализации Java.

Реляционные базы данных

DataDirect предоставить XQJ адаптеры за реляционные базы данных, переводя XQuery код в SQL на лету, затем преобразование Наборы результатов SQL в формат, подходящий для дальнейшей обработки XQJ. Ниже приводится пара известных реализаций.

Реализации без базы данных

Ниже приведен список не относящихся к базе данных XQuery процессоры, которые предоставляют интерфейс XQuery API для Java (обычно позволяющий запрашивать документы, проанализированные из XML в файловом хранилище и хранящиеся в памяти как DOM или подобные деревья).

Лицензия

Спецификация помечена как «Авторское право © Oracle 2003, 2006 - 2009. Все права защищены».

Спецификация содержит две отдельные лицензии: «лицензию на спецификацию» и «лицензию на эталонную реализацию».

Лицензия на спецификацию позволяет свободное копирование спецификации при сохранении уведомлений об авторских правах; он также предоставляет лицензию на создание и распространение реализации спецификации при условии, что она полностью реализует всю спецификацию, что она не изменяет и не расширяет какие-либо интерфейсы и что она проходит тесты на совместимость.

Это положение вызвало определенные споры. Во-первых, не повсеместно признается, что для реализации опубликованной спецификации требуется лицензия (то есть закон об авторском праве запрещает это при отсутствии лицензии).[20][21] Во-вторых, лицензия не соответствует критериям для квалификации лицензии с открытым исходным кодом (см. Определение открытого исходного кода ) из-за запрета на расширение и модификации. Это заставило некоторых энтузиастов открытого исходного кода усомниться в том, можно ли когда-либо считать реализации XQJ действительно открытыми.

Лицензия на эталонную реализацию представляет собой довольно обычную лицензию с открытым исходным кодом в стиле BSD.

Рекомендации

  1. ^ а б c d Модель данных XQuery 1.0 и XPath 2.0 (XDM)
  2. ^ Связывание переменных Java
  3. ^ Запросы XML: XQuery, XPath и SQL / XML в контексте - Джим Мелтон и Стивен Бакстон. ISBN  978-1558607118
  4. ^ а б XQJ - XQuery Java API завершен, Марк Ван Каппеллен, Чжэнь Хуа Лю, Джим Мелтон и Максим Оргиян В архиве 28 июля 2012 г. Wayback Machine
  5. ^ а б IBM и Oracle отправляют запрос на спецификацию Java XQuery API для Java (XQJ).
  6. ^ а б Ранний взгляд на XQuery API для Java (XQJ) - Эндрю Айзенберг, IBM и Джим Мелтон, Oracle В архиве 28 июля 2012 г. Wayback Machine
  7. ^ Процессор BEA Streaming XQuery
  8. ^ Интерфейс XQJ для собственной базы данных XML Tamino В архиве 30 мая 2013 г. Wayback Machine
  9. ^ JSR-000225 XQuery API для Java (окончательный выпуск)
  10. ^ Средство обновления XQuery
  11. ^ Полный текст XQuery
  12. ^ MarkLogic XQJ API
  13. ^ eXist XQJ API
  14. ^ BaseX XQJ API
  15. ^ API Sedna XQJ
  16. ^ Поддержка Oracle XML DB для XQJ
  17. ^ Software AG - Работа с интерфейсом CentraSite XQJ
  18. ^ Zorba 2.5 поставляется с долгожданной привязкой XQJ, 14 июня 2012 г.
  19. ^ Oracle XML Developer's Kit (XDK) предоставляет автономный процессор XQuery 1.0 для использования приложениями Java.
  20. ^ http://rosenlaw.com/wp-content/uploads/Open-Standards.pdf
  21. ^ http://www.groklaw.net/articlebasic.php?story=20120221094600287

внешняя ссылка