API XQuery для Java
Разработчик(и) | Процесс сообщества Java |
---|---|
Стабильная версия | 1.0
/ 24 июня 2009 г. |
Тип | API доступа к данным |
Веб-сайт | JSR 225: API XQuery для Java |
XQuery API для Java ( XQJ ) относится к общему Java API для спецификации W3C XQuery 1.0.
API XQJ позволяет программистам Java выполнять XQuery к XML источнику данных (например, базе данных XML ), одновременно уменьшая или устраняя привязку к поставщику .
API XQJ предоставляет разработчикам Java интерфейс к модели данных XQuery. [ 1 ] Его конструкция аналогична API JDBC , который имеет интерфейс клиент/сервер и поэтому хорошо подходит для серверных баз данных XML и менее подходит для процессоров XQuery на стороне клиента , хотя часть « соединения » представляет собой очень незначительную часть весь API. Пользователи API XQJ могут привязывать значения Java к выражениям XQuery , предотвращая атаки путем внедрения кода . [ 2 ] несколько выражений XQuery можно выполнить Кроме того, в рамках атомарной транзакции .
История и реализация
[ редактировать ]API XQuery для Java был разработан в рамках процесса сообщества Java как JSR 225 . У него было несколько крупных сторонников технологий, таких как Oracle . [ 3 ] [ 4 ] [ 5 ] [ 6 ] ИБМ , [ 5 ] [ 6 ] БЕА Системс , [ 7 ] Программное обеспечение АГ , [ 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 ] информация о типе, связанная с ним, такая как тип его узла, например element()
, document-node()
или атомарный тип XDM, например xs:string
, xs:integer
или xs:dateTime
. Информацию о типе XDM в XQJ можно получить через XQItemType
интерфейс.
Элементы Atomic XQuery можно легко преобразовать в Java с помощью примитивы XQItemAccessor
такие методы, как getByte()
и getFloat()
. Также элементы и последовательности XQuery можно сериализовать в DOM. Node
, ПРАВИЛЬНЫЙ ContentHandler
, СтаКС XMLStreamReader
и общий ввод-вывод Reader
и InputStream
занятия.
Примеры
[ редактировать ]Базовый пример
[ редактировать ]Следующий пример иллюстрирует создание соединения с базой данных XML , отправку выражения XQuery и последующую обработку результатов в Java . После обработки всех результатов соединение закрывается, чтобы освободить все связанные с ним ресурсы.
// Create a new connection to an XML database
XQConnection conn = vendorDataSource.getConnection("myUser", "myPassword");
XQExpression expr = conn.createExpression(); // Create a reusable XQuery Expression object
XQResultSequence result = expr.executeQuery(
"for $n in fn:collection('catalog')//item " +
"return fn:data($n/name)"); // execute an XQuery expression
// Process the result sequence iteratively
while (result.next()) {
// Print the current item in the sequence
System.out.println("Product name: " + result.getItemAsString(null));
}
// Free all resources created by the connection
conn.close();
Привязка значения к внешней переменной
[ редактировать ]В следующем примере показано, как значение Java можно привязать к внешней переменной в выражении XQuery .
Предположим, что связь conn
уже существует:
XQExpression expr = conn.createExpression();
// The XQuery expression to be executed
String es = "declare variable $x as xs:integer external;" +
" for $n in fn:collection('catalog')//item" +
" where $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 по умолчанию |
---|---|
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
|
Duratio
|
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.
- МаркЛогик [ 12 ]
- существовать [ 13 ]
- БазаX [ 14 ]
- Седна [ 15 ]
- Oracle XDB [ 16 ]
- Тамино [ 17 ]
- TigerLogic
Реляционные базы данных
[ редактировать ]DataDirect предоставляет адаптеры XQJ для реляционных баз данных , преобразуя XQuery код в SQL на лету, а затем преобразуя наборы результатов SQL в формат, подходящий для дальнейшей обработки XQJ. Ниже приводится пара известных реализаций.
Реализации без базы данных
[ редактировать ]Ниже приведен список процессоров XQuery, не относящихся к базе данных , которые предоставляют интерфейс XQuery API для Java (обычно позволяющий выполнять запросы к документам, проанализированным из XML в хранилище файлов и хранящимся в памяти в виде DOM или аналогичных деревьев).
- Saxon XSLT и процессор XQuery
- Властный [ 18 ]
- MXQuery
- Процессор Oracle XQuery [ 19 ]
Лицензия
[ редактировать ]Спецификация помечена как «Авторские права © Oracle, 2003, 2006–2009. Все права защищены».
Спецификация содержит две отдельные лицензии: «лицензию на спецификацию» и «лицензию на эталонную реализацию».
Лицензия на спецификацию разрешает свободное копирование спецификации при условии сохранения уведомлений об авторских правах; он также предоставляет лицензию на создание и распространение реализации спецификации при условии, что она полностью реализует всю спецификацию, не изменяет и не расширяет какие-либо интерфейсы и проходит тесты на совместимость.
Это положение вызвало некоторые споры. Во-первых, не является общепринятым тот факт, что реализация опубликованной спецификации требует лицензии (то есть закон об авторском праве запрещает это в отсутствие лицензии). [ 20 ] [ 21 ] Во-вторых, лицензия не соответствует критериям, позволяющим квалифицироваться как лицензия с открытым исходным кодом (см. Определение открытого исходного кода ) из-за запрета на внесение расширений и модификаций. Это заставило некоторых энтузиастов открытого исходного кода задаться вопросом, можно ли когда-либо считать реализации XQJ действительно открытым исходным кодом.
Лицензия на эталонную реализацию представляет собой довольно традиционную лицензию с открытым исходным кодом в стиле BSD.
Ссылки
[ редактировать ]- ^ Перейти обратно: а б с д Модель данных XQuery 1.0 и XPath 2.0 (XDM)
- ^ Привязка переменных Java
- ^ Запросы XML: XQuery, XPath и SQL/XML в контексте - Джим Мелтон и Стивен Бакстон. ISBN 978-1558607118
- ^ Перейти обратно: а б XQJ — XQuery Java API завершен, Марк Ван Каппеллен, Чжэнь Хуа Лю, Джим Мелтон и Максим Оргиян. Архивировано 28 июля 2012 г. на Wayback Machine.
- ^ Перейти обратно: а б IBM и Oracle отправляют запрос на спецификацию Java XQuery API для Java (XQJ).
- ^ Перейти обратно: а б Ранний взгляд на XQuery API для Java (XQJ) — Эндрю Айзенберг, IBM и Джим Мелтон, Oracle. Архивировано 28 июля 2012 г. на Wayback Machine.
- ^ Процессор BEA Streaming XQuery
- ^ Интерфейс XQJ для собственной XML-базы данных Tamino. Архивировано 30 мая 2013 г. на Wayback Machine.
- ^ JSR-000225 API XQuery для Java (окончательная версия)
- ^ Средство обновления XQuery
- ^ Полный текст XQuery
- ^ API MarkLogic XQJ
- ^ eXist XQJ API
- ^ API BaseX XQJ
- ^ API Седны XQJ
- ^ Поддержка Oracle XML DB для XQJ
- ^ Software AG - Работа с интерфейсом CentraSite XQJ
- ^ Zorba 2.5 поставляется с долгожданной привязкой XQJ, 14 июня 2012 г.
- ^ Комплект разработчика Oracle XML (XDK) предоставляет автономный процессор XQuery 1.0 для использования приложениями Java.
- ^ «Открытые стандарты» (PDF) . Проверено 7 сентября 2023 г.
- ^ «Groklaw — Oracle против Google — понимание проблемы авторских прав со спецификациями API» . www.groklaw.net . Архивировано из оригинала 5 мая 2012 года.
Внешние ссылки
[ редактировать ]- Javadoc для XQJ
- Учебное пособие по XQJ
- Построение мостов от Java к XQuery, Чарльз Фостер. XML Прага 2012 ( презентация Prezi )
- Java-интеграция XQuery, Ханс-Юрген Реннау. Балисаж 2010
- Формы Орбеона с использованием XQJ
- Spring Интеграция Поддержка XQuery
- XQS: XQuery для Scala (находится поверх XQJ)
- Плагин поддержки IntelliJ XQuery