La API de XQuery para Java ( XQJ ) se refiere a la API común de Java para la especificación W3C XQuery 1.0.
Desarrollador (es) | Proceso de la comunidad de Java |
---|---|
Lanzamiento estable | 1.0 / 24 de junio de 2009 |
Tipo | API de acceso a datos |
Sitio web | JSR 225: API XQuery para Java |
La API de XQJ permite a los programadores de Java ejecutar XQuery contra una fuente de datos XML (por ejemplo, una base de datos XML ) mientras reduce o elimina el bloqueo del proveedor .
La API de XQJ proporciona a los desarrolladores de Java una interfaz para el modelo de datos de XQuery. [1] Su diseño es similar a la API de JDBC, que tiene una sensación de cliente / servidor y, como tal, se presta bien a las bases de datos XML basadas en servidor y menos a los procesadores XQuery del lado del cliente , aunque la parte de " conexión " es muy pequeña. parte de toda la API. Los usuarios de la API XQJ pueden vincular valores Java a expresiones XQuery , evitando ataques de inyección de código . [2] Además, se pueden ejecutar múltiples expresiones XQuery como parte de una transacción atómica .
Historia e implementación
La API XQuery para Java se desarrolló en Java Community Process como JSR 225 . Tenía algunos grandes patrocinadores de tecnología como Oracle , [3] [4] [5] [6] IBM , [5] [6] BEA Systems , [7] Software AG , [8] Intel , Nokia y DataDirect . [4]
La versión 1.0 de la API XQuery para la especificación de Java fue lanzada el 24 de junio de 2009, [9] junto con JavaDocs , una implementación de referencia y un TCK (Technology Compatibility Kit) que los proveedores de implementación deben cumplir.
Las clases XQJ están incluidas en el paquete Java. javax.xml.xquery
No hay actividad (visible) para crear una versión de XQJ que proporcione soporte para XQuery 3.0 o 3.1, por ejemplo, proporcionando enlaces Java para adiciones al modelo de datos, como funciones, matrices o mapas.
Funcionalidad
XQJ permite que existan múltiples implementaciones y sean utilizadas por la misma aplicación.
Las conexiones XQJ admiten la creación y ejecución de expresiones XQuery . Las expresiones pueden actualizarse [10] y pueden incluir búsquedas de texto completo. [11] XQJ representa expresiones XQuery usando una de las siguientes clases:
XQExpression
- la expresión se envía al procesador XQuery cada vez.XQPreparedExpression
- la expresión se almacena en caché y la ruta de ejecución está predeterminada, lo que permite que se ejecute varias veces de manera eficiente.
Las expresiones XQuery devuelven una secuencia de resultados de elementos XDM [1] que en XQJ se representan a través de la XQResultSequence
interfaz. El programador puede utilizar un XQResultSequence
para recorrer elementos XDM [1] individuales en la secuencia de resultados. Cada elemento de la secuencia tiene asociada información de tipo XDM [1] , como su tipo de nodo element()
, por ejemplo , document-node()
o un tipo atómico de XDM como xs:string
, xs:integer
o xs:dateTime
. La información de tipo XDM en XQJ se puede recuperar a través de la XQItemType
interfaz.
Los elementos de Atomic XQuery se pueden convertir fácilmente a primitivas de Java a través de XQItemAccessor
métodos como getByte()
y getFloat()
. También los elementos y secuencias de XQuery se pueden serializar en DOM Node
, SAX ContentHandler
, StAX XMLStreamReader
y las IO Reader
y InputStream
clases genéricas .
Ejemplos de
Ejemplo básico
El siguiente ejemplo ilustra la creación de una conexión a una base de datos XML , el envío de una expresión XQuery y luego el procesamiento de los resultados en Java . Una vez que se han procesado todos los resultados, la conexión se cierra para liberar todos los recursos asociados a ella.
// Cree una nueva conexión a una base de datos XML XQConnection conn = vendorDataSource . getConnection ( "myUser" , "myPassword" );XQExpression expr = conn . createExpression (); // Crea un objeto XQuery Expression reutilizableXQResultSequence resultado = expr . executeQuery ( "para $ n en fn: colección ('catálogo') // elemento" + "return fn: data ($ n / nombre)" ); // ejecutar una expresión XQuery// Procesar la secuencia de resultados de forma iterativa while ( result . Next ()) { // Imprimir el elemento actual en la secuencia System . fuera . println ( "Nombre del producto:" + resultado . getItemAsString ( nulo )); }// Libera todos los recursos creados por la conexión conn . cerrar ();
Vincular un valor a una variable externa
El siguiente ejemplo ilustra cómo se puede vincular un valor de Java a una variable externa en una expresión XQuery . Suponga que la conexión conn
ya existe:
XQExpression expr = conn . createExpression ();// La expresión XQuery que se ejecutará String es = "declarar la variable $ x como xs: integer external;" + "para $ n en fn: colección ('catálogo') // artículo" + "donde $ n / precio <= $ x" + "return fn: datos ($ n / nombre)" ;// Vincular un valor (21) a una variable externa con QName x expr . bindInt ( nuevo QName ( "x" ), 21 , nulo );// Ejecuta la expresión XQuery XQResultSequence result = expr . executeQuery ( es );// Procesar el resultado (secuencia) iterativamente while ( resultado . Next ()) { // Procesar el resultado ... }
Asignación de tipos de datos predeterminados
El mapeo entre los tipos de datos Java y XQuery es en gran parte flexible, sin embargo, la especificación XQJ 1.0 tiene reglas de mapeo predeterminadas que mapean tipos de datos cuando el usuario no los especifica. Estas reglas de mapeo tienen grandes similitudes con las reglas de mapeo que se encuentran en JAXB .
La siguiente tabla ilustra las reglas de asignación predeterminadas para cuando se vinculan valores de Java a variables externas en expresiones XQuery .
Tipo de datos Java | Tipo (s) de datos XQuery predeterminados |
---|---|
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 si el Duration estado del Objeto esxs:dayTimeDuration |
xs:yearMonthDuration si el Duration estado del Objeto esxs:yearMonthDuration | |
xs:duration si el Duration estado del Objeto esxs:duration | |
XMLGregorianCalendar | xs:date si el XMLGregorianCalendar estado del Objeto esxs:date |
xs:dateTime si el XMLGregorianCalendar estado del Objeto esxs:dateTime | |
xs:gDay si el XMLGregorianCalendar estado del Objeto esxs:gDay | |
xs:gMonth si el XMLGregorianCalendar estado del Objeto esxs:gMonth | |
xs:gMonthDay si el XMLGregorianCalendar estado del Objeto esxs:gMonthDay | |
xs:gYear si el XMLGregorianCalendar estado del Objeto esxs:gYear | |
xs:gYearMonth si el XMLGregorianCalendar estado del Objeto esxs:gYearMonth | |
xs:time si el XMLGregorianCalendar estado del Objeto esxs: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() |
Implementaciones conocidas
Bases de datos XML nativas
La siguiente es una lista de bases de datos XML nativas que se sabe que tienen implementaciones de API XQuery para Java.
- MarkLogic [12]
- eXist [13]
- BaseX [14]
- Sedna [15]
- Oracle XDB [16]
- Tamino [17]
- TigerLogic
Bases de datos relacionales
DataDirect proporciona adaptadores XQJ para bases de datos relacionales , traduciendo el código XQuery a SQL sobre la marcha y luego convirtiendo los conjuntos de resultados SQL en un formato adecuado para que XQJ siga procesando. A continuación, se muestran un par de implementaciones conocidas.
- Oracle DB (no XDB)
- IBM DB2
- Microsoft SQL Server
- Sybase ASE
- Informix
- MySQL
- PostgreSQL
Implementaciones que no son de base de datos
La siguiente es una lista de procesadores XQuery que no son de base de datos y que proporcionan una interfaz API XQuery para Java (que normalmente permite consultas en documentos analizados desde XML en el almacén de archivos y guardados en la memoria como DOM o árboles similares).
- Procesador Saxon XSLT y XQuery
- Zorba [18]
- MXQuery
- Procesador Oracle XQuery [19]
Licencia
La especificación está marcada como "Copyright © 2003, 2006 - 2009 Oracle. Todos los derechos reservados".
La especificación contiene dos licencias independientes: una "licencia de especificación" y una "licencia de implementación de referencia".
La licencia de especificación permite la copia gratuita de la especificación siempre que se conserven los avisos de derechos de autor; también otorga una licencia para crear y distribuir una implementación de la especificación siempre que implemente completamente la especificación completa, que no modifique ni extienda ninguna interfaz y que pase las pruebas de compatibilidad.
Esta disposición ha provocado cierta controversia. En primer lugar, no se acepta universalmente que la implementación de una especificación publicada sea algo que requiera una licencia (es decir, que la ley de derechos de autor no permitiría esto en ausencia de una licencia). [20] [21] En segundo lugar, la licencia no cumple los criterios para calificar como una licencia de código abierto (ver Definición de código abierto ), debido a la prohibición de hacer extensiones y modificaciones. Esto ha llevado a algunos entusiastas del código abierto a cuestionar si las implementaciones de XQJ pueden alguna vez considerarse verdaderamente de código abierto.
La licencia para la implementación de referencia es una licencia de código abierto de estilo BSD bastante convencional.
Referencias
- ^ a b c d Modelo de datos de XQuery 1.0 y XPath 2.0 (XDM)
- ^ Vinculación de variables de Java
- ^ Consultando XML: XQuery, XPath y SQL / XML en contexto - Jim Melton y Stephen Buxton. ISBN 978-1558607118
- ^ a b XQJ - XQuery Java API is complete, Marc Van Cappellen, Zhen Hua Liu, Jim Melton y Maxim Orgiyan Archivado el 28 de julio de 2012 en Wayback Machine
- ^ a b IBM y Oracle envían la solicitud de especificación de Java de la API XQuery para Java (XQJ).
- ^ a b Una mirada temprana a la API de XQuery para Java (XQJ) - Andrew Eisenberg, IBM y Jim Melton, Oracle Archivado el 28 de julio de 2012 en Wayback Machine
- ^ El procesador BEA Streaming XQuery
- ^ Interfaz XQJ para la base de datos XML nativa de Tamino Archivado el 30 de mayo de 2013 en Wayback Machine
- ^ JSR-000225 API XQuery para Java (versión final)
- ^ Instalación de actualización de XQuery
- ^ Texto completo de XQuery
- ^ API MarkLogic XQJ
- ^ API eXist XQJ
- ^ API BaseX XQJ
- ^ API de Sedna XQJ
- ^ Soporte de Oracle XML DB para XQJ
- ^ Software AG - Trabajar con la interfaz CentraSite XQJ
- ^ Zorba 2.5 se envía con un enlace XQJ tan esperado, 14 de junio de 2012
- ^ Oracle XML Developer's Kit (XDK) proporciona un procesador XQuery 1.0 independiente para su uso por aplicaciones Java.
- ^ http://rosenlaw.com/wp-content/uploads/Open-Standards.pdf
- ^ http://www.groklaw.net/articlebasic.php?story=20120221094600287
enlaces externos
- Javadoc para XQJ
- Tutorial de XQJ
- Construyendo puentes de Java a XQuery, Charles Foster. XML Praga 2012 ( Presentación Prezi )
- Integración Java de XQuery, Hans-Jürgen Rennau. Balisage 2010
- Formularios de Orbeon con XQJ
- Compatibilidad con Spring Integration XQuery
- XQS: XQuery para Scala (se coloca encima de XQJ)
- Complemento de compatibilidad con IntelliJ XQuery