Разработчики) | Процесс сообщества Java |
---|---|
Стабильный выпуск | 1.0 / 24 июня 2009 г. |
Тип | API доступа к данным |
Веб-сайт | JSR 225: API XQuery для Java |
XQuery API для Java ( XQJ ) относится к общему API Java для спецификации W3C XQuery 1.0.
XQJ API позволяет программистам Java выполнять XQuery для источника данных XML (например, базы данных XML ), уменьшая или устраняя привязку к поставщику .
XQJ API предоставляет разработчикам Java интерфейс для модели данных XQuery. [1] Его дизайн похож на JDBC API, который работает как клиент / сервер, и поэтому хорошо подходит для серверных баз данных XML и хуже - для процессоров XQuery на стороне клиента , хотя « соединение » очень незначительно. часть всего API. Пользователи XQJ API могут связывать значения Java с выражениями XQuery , предотвращая атаки путем внедрения кода . [2] Кроме того, несколько выражений XQuery могут выполняться как часть атомарной транзакции .
История и реализация [ править ]
XQuery API для Java был разработан Java Community Process как 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 (Technology Compatibility Kit), которым должны соответствовать поставщики, реализующие эту технологию .
Классы 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] , такую как тип его узла, например element()
, document-node()
или атомарный тип XDM, такой как xs:string
, xs:integer
или xs:dateTime
. Информацию о типе XDM в XQJ можно получить через XQItemType
интерфейс.
Атомарные элементы XQuery можно легко преобразовать в примитивы Java с помощью XQItemAccessor
таких методов, как getByte()
и getFloat()
. Также элементы и последовательности XQuery могут быть сериализованы в DOM Node
, SAX ContentHandler
, StAX XMLStreamReader
и общий ввод-вывод Reader
и InputStream
классы.
Примеры [ править ]
Базовый пример [ править ]
В следующем примере показано создание соединения с базой данных XML , отправка выражения XQuery и последующая обработка результатов в Java . После обработки всех результатов соединение закрывается, чтобы освободить все связанные с ним ресурсы.
// Создание нового подключения к базе данных XML XQConnection соппы = vendorDataSource . getConnection ( "myUser" , "myPassword" );XQExpression expr = conn . createExpression (); // Создание многоразового объекта XQuery ExpressionXQResultSequence result = expr . executeQuery ( "for $ n in fn: collection ('catalog') // item" + "return fn: data ($ n / name)" ); // выполняем выражение XQuery// Итеративно обрабатываем результирующую последовательность while ( result . Next ()) { // Распечатываем текущий элемент в последовательности System . из . println ( "Название продукта:" + результат . getItemAsString ( null )); }// Освобождаем все ресурсы, созданные соединением conn . закрыть ();
Привязка значения к внешней переменной [ править ]
В следующем примере показано, как значение Java может быть привязано к внешней переменной в выражении XQuery . Предположим, что соединение conn
уже существует:
XQExpression expr = conn . createExpression ();// Выражение XQuery, которое будет выполнено String es = "объявить переменную $ x как xs: integer external;" + "for $ n в fn: collection ('catalog') // item" + "где $ n / price <= $ x" + "return fn: data ($ n / name)" ;// Связываем значение (21) с внешней переменной с QName x expr . bindInt ( новое QName ( "x" ), 21 , ноль );// Выполнение выражения XQuery XQResultSequence result = expr . executeQuery ( es );// Итеративная обработка результата (последовательности) while ( result . Next ()) { // Обработка результата ... }
Сопоставление типов данных по умолчанию [ править ]
Сопоставление между типами данных Java и XQuery в значительной степени гибкое, однако в спецификации XQJ 1.0 есть правила сопоставления по умолчанию, отображающие типы данных, когда они не указаны пользователем. Эти правила отображения во многом похожи на правила отображения в JAXB .
В следующей таблице показаны правила сопоставления по умолчанию для привязки значений Java к внешним переменным в выражениях XQuery .
Тип данных Java | Тип (ы) данных XQuery по умолчанию |
---|---|
boolean | xs:boolean |
byte | xs:byte |
byte[] | xs:hexBinary |
double | xs:double |
float | xs:float |
int | xs:int |
long | xs:long |
short | xs:short |
Boolean | xs:boolean |
Byte | xs:byte |
Float | xs:float |
Double | xs:double |
Integer | xs:int |
Long | xs:long |
Short | xs:short |
String | xs:string |
BigDecimal | xs:decimal |
BigInteger | xs:integer |
Duration | xs:dayTimeDuration если состояние Duration объектаxs:dayTimeDuration |
xs:yearMonthDuration если состояние Duration объектаxs:yearMonthDuration | |
xs:duration если состояние Duration объектаxs:duration | |
XMLGregorianCalendar | xs: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 | |
xs:time если состояние XMLGregorianCalendar объектаxs:time | |
QName | xs:QName |
Document | document-node(element(*, xs:untyped)) |
DocumentFragment | document-node(element(*, xs:untyped)) |
Element | element(*, xs:untyped) |
Attr | attribute(*, xs:untypedAtomic) |
Comment | comment() |
ProcessingInstruction | processing-instruction() |
Text | text() |
Известные реализации [ править ]
Собственные базы данных XML [ править ]
Ниже приводится список собственных баз данных XML, которые, как известно, имеют XQuery API для реализации Java.
- MarkLogic [12]
- eXist [13]
- BaseX [14]
- Седна [15]
- Oracle XDB [16]
- Тамино [17]
- TigerLogic
Реляционные базы данных [ править ]
DataDirect предоставляет адаптеры XQJ для реляционных баз данных , переводя код XQuery в SQL на лету, а затем преобразовывая наборы результатов SQL в формат, подходящий для дальнейшей обработки XQJ. Ниже приводится пара известных реализаций.
- Oracle DB (не XDB)
- IBM DB2
- Microsoft SQL Server
- Sybase ASE
- Informix
- MySQL
- PostgreSQL
Реализации вне базы данных [ править ]
Ниже приведен список процессоров XQuery, не относящихся к базе данных , которые предоставляют XQuery API для интерфейса Java (обычно разрешающие запросы к документам, анализируемым из XML в хранилище файлов и хранящимся в памяти как DOM или подобные деревья).
- Saxon XSLT и процессор XQuery
- Зорба [18]
- MXQuery
- Процессор Oracle XQuery [19]
Лицензия [ править ]
Спецификация помечена как «Авторское право © Oracle 2003, 2006 - 2009. Все права защищены».
Спецификация содержит две отдельные лицензии: «лицензию на спецификацию» и «лицензию на эталонную реализацию».
Лицензия на спецификацию позволяет свободное копирование спецификации при условии сохранения уведомлений об авторских правах; он также предоставляет лицензию на создание и распространение реализации спецификации при условии, что она полностью реализует всю спецификацию, не изменяет и не расширяет какие-либо интерфейсы и что она проходит тесты на совместимость.
Это положение вызвало определенные споры. Во-первых, не все признают, что для реализации опубликованной спецификации требуется лицензия (то есть закон об авторском праве запрещает это при отсутствии лицензии). [20] [21] Во-вторых, лицензия не соответствует критериям для квалификации как лицензия с открытым исходным кодом (см. Определение открытого исходного кода ) из-за запрета на создание расширений и модификаций. Это заставило некоторых энтузиастов открытого исходного кода усомниться в том, можно ли когда-либо считать реализации XQJ действительно открытыми.
Лицензия на эталонную реализацию представляет собой довольно обычную лицензию с открытым исходным кодом в стиле BSD.
Ссылки [ править ]
- ^ a b c d Модель данных XQuery 1.0 и XPath 2.0 (XDM)
- ^ Привязка переменных Java
- ^ Запросы XML: XQuery, XPath и SQL / XML в контексте - Джим Мелтон и Стивен Бакстон. ISBN 978-1558607118
- ^ a b XQJ - XQuery Java API завершен, Марк Ван Каппеллен, Чжэнь Хуа Лю, Джим Мелтон и Максим Оргиян. Архивировано 28 июля 2012 г. на Wayback Machine.
- ^ a b IBM и Oracle отправляют запрос спецификации Java XQuery API для Java (XQJ).
- ^ a b Ранний взгляд на XQuery API для Java (XQJ) - Эндрю Эйзенберг, IBM и Джим Мелтон, Oracle. Архивировано 28 июля 2012 г. на Wayback Machine.
- ^ Процессор BEA Streaming XQuery
- ^ Интерфейс XQJ для базы данных Tamino Native XML. Архивировано 30 мая 2013 г. на Wayback Machine.
- ^ JSR-000225 API XQuery для Java (окончательный выпуск)
- ^ Средство обновления XQuery
- ^ XQuery Полный текст
- ^ MarkLogic XQJ API
- ^ eXist XQJ API
- ^ BaseX XQJ API
- ^ Sedna XQJ API
- ^ Поддержка Oracle XML DB для XQJ
- ^ Software AG - Работа с интерфейсом CentraSite XQJ
- ^ Зорба 2.5 поставляется с долгожданным XQJ связывания, 14 июня 2012 года
- ^ Oracle XML Developer's Kit (XDK) предоставляет автономный процессор XQuery 1.0 для использования приложениями Java.
- ^ http://rosenlaw.com/wp-content/uploads/Open-Standards.pdf
- ^ http://www.groklaw.net/articlebasic.php?story=20120221094600287
Внешние ссылки [ править ]
- Документация Javadoc для XQJ
- XQJ Учебник
- Наводя мосты от Java к XQuery, Чарльз Фостер. XML Прага 2012 ( презентация Prezi )
- Интеграция XQuery с Java, Ханс-Юрген Реннау. Balisage 2010
- Формы Orbeon с использованием XQJ
- Spring Integration Поддержка XQuery
- XQS: XQuery для Scala (находится поверх XQJ)
- Плагин поддержки IntelliJ XQuery