Разработчик (и) | Процесс сообщества Java |
---|---|
Стабильный выпуск | 1.0 / 24 Июнь 2009 г. (24.06.2009) |
Тип | API доступа к данным |
Веб-сайт | JSR 225: XQuery API для Java |
XQuery API для Java (XQJ ) относится к общему Java API для W3C XQuery 1.0.
XQJ API позволяет Java-программистам выполнять XQuery с источником данных XML (например, базой данных XML ), сокращая или исключая блокировка поставщика в.
XQJ API предоставляет разработчикам Java интерфейс для модели данных XQuery. Его дизайн похож на JDBC API, который работает как клиент / сервер, и поэтому хорошо подходит для серверных XML-баз данных и хуже - для клиентских XQuery. процессоров, хотя часть «соединение » является очень незначительной частью всего API. Пользователи XQJ API могут связывать значения Java с выражениями XQuery, предотвращая атаки внедрения кода. Кроме того, несколько выражений XQuery могут быть выполнены как часть атомарной транзакции.
XQuery API для Java был разработан Java Community Process как JSR 225. У него были крупные технологические сторонники, такие как Oracle, IBM, BEA Systems, Software AG, Intel, Nokia и DataDirect.
Версия 1.0 XQuery API для спецификации Java была выпущена 24 июня 2009 года вместе с JavaDocs, эталонной реализацией и TCK (Technology Compatibility Kit), которым должны соответствовать поставщики.
Классы XQJ содержатся в пакете Java javax.xml.xquery
Нет (видимых) действий по созданию версии XQJ, обеспечивающей поддержку XQuery 3.0 или 3.1., например, путем предоставления привязок Java для дополнений к модели данных, таких как функции, массивы или карты.
XQJ позволяет существовать нескольким реализациям и использоваться одним и тем же приложением.
XQJ-соединения поддерживают создание и выполнение XQuery выражений. Выражения могут обновляться и включать полнотекстовый поиск. XQJ представляет выражения XQuery с использованием одного из следующих классов:
XQExpression
- выражение каждый раз отправляется процессору XQuery.XQPreparedExpression
- выражение кэшируется, а путь выполнения заранее определен, что позволяет ему эффективно выполняться несколько раз.Выражения XQuery возвращают результирующую последовательность элементов XDM, которые в XQJ представлены через XQResultSequence
интерфейс. Программист может использовать XQResultSequence
для обхода отдельных элементов XDM в результирующей последовательности. Каждый элемент в последовательности имеет связанную с ним информацию о типе XDM, такую как тип его узла, например. element ()
, document-node ()
или атомарный тип XDM, например xs: string
, xs: integer
или xs: dateTime
. Информацию о типе XDM в XQJ можно получить через интерфейс XQItemType
.
Элементы Atomic XQuery можно легко преобразовать в примитивы Java с помощью методов XQItemAccessor
, таких как getByte ()
и getFloat()
. Также элементы и последовательности XQuery могут быть сериализованы в DOM Node
, SAX ContentHandler
, StAX XMLStreamReader
и общий IO Reader
и InputStream
классы.
В следующем примере показано создание соединения с базой данных XML, отправка выражения XQuery, затем обработка результатов в Java. После обработки всех результатов соединение закрывается, чтобы освободить все связанные с ним ресурсы.
// Создаем новое соединение с базой данных XML XQConnection conn = vendorDataSource.getConnection ("myUser", "myPassword"); XQExpression expr = conn.createExpression (); // Создание многоразового объекта выражения XQuery XQResultSequence result = expr.executeQuery ("для $ n в fn: collection ('catalog') // item" + "return fn: data ($ n / name)"); // выполнение выражения XQuery // Итеративная обработка результирующей последовательности while (result.next ()) {// Печать текущего элемента в последовательности System.out.println ("Product name:" + result.getItemAsString (null)) ; } // Освобождаем все ресурсы, созданные соединением conn.close ();
В следующем примере показано, как значение Java может быть привязано к внешней переменной в выражении XQuery. Предположим, что соединение conn
уже существует:
XQExpression expr = conn.createExpression (); // Выражение XQuery, которое будет выполнено String es = "объявить переменную $ x как xs: integer external;" + "for $ n in fn: collection ('catalog') // item" + "где $ n / price <= $x" + " return fn:data($n/name)"; // Bind a value (21) to an external variable with the QName x expr.bindInt(new QName("x"), 21, null); // Execute the XQuery expression XQResultSequence result = expr.executeQuery(es); // Process the result (sequence) iteratively while (result.next()) { // Process the result... }
Отображение между Java и Типы данных XQuery в значительной степени гибки, однако в спецификации XQJ 1.0 действительно есть правила сопоставления по умолчанию, типы данных сопоставления, когда они не указаны пользователем. Эти правила сопоставления имеют большое сходство с правилами сопоставления, найденными в JAXB.
В следующей таблице показаны правила сопоставления по умолчанию для привязки значений Java к внешним переменным в выражениях XQuery.
Тип данных Java | Тип (ы) данных XQuery по умолчанию |
---|---|
логический | 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 |
Длинный | 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 Состояние ect равно 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: нетипизированный) |
Attr | attribute (*, xs: untypedAtomic) |
Комментарий | comment () |
ProcessingInstruction | processing-command () |
Text | text () |
Ниже приводится список Собственных баз данных XML, которые, как известно, имеют XQuery API для реализаций Java.
DataDirect предоставляют XQJ адаптеров для реляционных баз данных, путем преобразования кода XQuery в SQL на лету, а затем преобразования наборов результатов SQL в формат, подходящий для дальнейшей обработки XQJ. Ниже приводится пара известных реализаций.
Ниже приведен список процессоров, не связанных с базой данных XQuery, которые предоставляют XQuery API для интерфейса Java (обычно разрешают запросы к документам, проанализированным из XML в хранилище файлов и хранящимся в памяти как DOM или подобные деревья).
Спецификация помечена как «Copyright © 2003, 2006 - 2009 Oracle. Все права защищены."
Спецификация содержит две отдельные лицензии: «лицензию на спецификацию» и «лицензию на эталонную реализацию».
Лицензия на спецификацию позволяет свободное копирование спецификации при условии сохранения уведомлений об авторских правах; он также предоставляет лицензию на создание и распространение реализации спецификации при условии, что она полностью реализует всю спецификацию, что она не изменяет и не расширяет какие-либо интерфейсы и что она проходит тесты на совместимость.
Это положение вызвало споры. Во-первых, не повсеместно признается, что для реализации опубликованной спецификации требуется лицензия (то есть закон об авторском праве запрещает это при отсутствии лицензии). Во-вторых, лицензия не соответствует критериям для квалификации как лицензия с открытым исходным кодом (см. Определение с открытым исходным кодом ) из-за запрета на создание расширений и модификаций. Это заставило некоторых энтузиастов открытого исходного кода усомниться в том, можно ли когда-либо считать реализации XQJ действительно открытыми.
Лицензия на эталонную реализацию представляет собой довольно обычную лицензию с открытым исходным кодом в стиле BSD.