Articulo de referencia

API XQuery para Java

Arquitectura general de cómo se utiliza un controlador XQJ para comunicarse con una base de datos XML desde aplicaciones Java. La API XQuery para Java ( XQJ ) hace referencia a ...

Arquitectura general de cómo se utiliza un controlador XQJ para comunicarse con una base de datos XML desde aplicaciones Java.

La API XQuery para Java ( XQJ ) hace referencia a la API Java común para la especificación XQuery 1.0 del W3C .

La API XQJ permite a los programadores de Java ejecutar XQuery contra una fuente de datos XML (por ejemplo, una base de datos XML ) al tiempo que reduce o elimina la dependencia del proveedor .

La API XQJ proporciona a los desarrolladores de Java una interfaz para el modelo de datos XQuery. [ 1 ] Su diseño es similar a la API JDBC , que tiene una arquitectura cliente/servidor y, como tal, se adapta 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 una parte muy pequeña de toda la API. Los usuarios de la API XQJ pueden vincular valores Java a expresiones XQuery , lo que previene 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 el Java Community Process como JSR 225. Contó con el respaldo de importantes empresas tecnológicas 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 especificación de la API XQuery para Java se publicó el 24 de junio de 2009, [ 9 ] junto con JavaDocs , una implementación de referencia y un TCK (Kit de compatibilidad tecnológica) al que deben ajustarse los proveedores implementadores.

Las clases XQJ están contenidas en el paquete Java.javax.xml.xquery

No existe ninguna actividad (visible) para crear una versión de XQJ que ofrezca compatibilidad con XQuery 3.0 o 3.1, por ejemplo, proporcionando enlaces Java para añadir elementos al modelo de datos como funciones, matrices o mapas.

Funcionalidad

XQJ permite que existan múltiples implementaciones y que una misma aplicación las utilice.

Las conexiones XQJ admiten la creación y ejecución de expresiones XQuery . Las expresiones pueden actualizar [ 10 ] y pueden incluir búsquedas de texto completo. [ 11 ] XQJ representa las expresiones XQuery utilizando 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 ejecutarla 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 XQResultSequenceinterfaz. El programador puede usar un XQResultSequencepara recorrer los elementos XDM [ 1 ] individuales en la secuencia de resultados. Cada elemento en la secuencia tiene información de tipo XDM [ 1 ] asociada, como su tipo de nodo, por ejemplo element(), document-node()o un tipo atómico XDM como xs:stringo xs:integer. xs:dateTimeLa información de tipo XDM en XQJ se puede recuperar a través de la XQItemTypeinterfaz.

Los elementos atómicos de XQuery se pueden convertir fácilmente a tipos primitivos de Java mediante XQItemAccessormétodos como getByte()y getFloat(). Además, los elementos y secuencias de XQuery se pueden serializar a DOMNode , SAXContentHandler , StAXXMLStreamReader y las clases genéricas de E/ ReaderS InputStream.

Ejemplos

Ejemplo básico

El siguiente ejemplo ilustra cómo crear una conexión a una base de datos XML , enviar una expresión XQuery y, a continuación, procesar los resultados en Java . Una vez procesados ​​todos los resultados, se cierra la conexión para liberar los recursos asociados.

// Crea una nueva conexión a una base de datos XML XQConnection conn = vendorDataSource . getConnection ( "myUser" , "myPassword" );XQExpression expr = conn.createExpression ( ); // Crea un objeto de expresión XQuery reutilizableXQResultSequence result = expr . executeQuery ( "for $n in fn:collection('catalog')//item " + "return fn:data($n/name)" ); // ejecutar una expresión XQuery// Procesar la secuencia de resultados de forma iterativa while ( result . next ()) { // Imprimir el elemento actual de la secuencia System . out . println ( "Nombre del producto: " + result . getItemAsString ( null )); }// Libera todos los recursos creados por la conexión conn.close ( ) ;

Vincular un valor a una variable externa

El siguiente ejemplo ilustra cómo se puede vincular un valor Java a una variable externa en una expresión XQuery . Supongamos que la conexión connya existe:

XQExpression expr = conn.createExpression ( ) ;// La expresión XQuery que se ejecutará 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)" ;// Vincula un valor (21) a una variable externa con el QName x expr . bindInt ( new QName ( "x" ), 21 , null );// Ejecutar la expresión XQuery XQResultSequence result = expr . executeQuery ( es );// Procesar el resultado (secuencia) iterativamente mientras ( resultado.siguiente ( )) { // Procesar el resultado ... }

Asignación de tipos de datos predeterminados

La correspondencia entre los tipos de datos de Java y XQuery es bastante flexible; sin embargo, la especificación XQJ 1.0 incluye reglas de correspondencia predeterminadas para los tipos de datos que no son especificados por el usuario. Estas reglas de correspondencia guardan gran similitud con las reglas de correspondencia de JAXB .

La siguiente tabla ilustra las reglas de asignación predeterminadas para vincular valores Java a variables externas en expresiones XQuery .

Implementaciones conocidas

Bases de datos XML nativas

A continuación se muestra una lista de bases de datos XML nativas que se sabe que cuentan con implementaciones de la API XQuery para Java.

Bases de datos relacionales

DataDirect proporciona adaptadores XQJ para bases de datos relacionales , traduciendo el código XQuery a SQL sobre la marcha y convirtiendo los conjuntos de resultados SQL a un formato adecuado para que XQJ los procese. A continuación, se muestran algunas implementaciones conocidas.

Implementaciones sin base de datos

A continuación se presenta una lista de procesadores XQuery que no utilizan bases de datos y que proporcionan una interfaz API XQuery para Java (que normalmente permite realizar consultas sobre documentos analizados a partir de XML almacenados en archivos y mantenidos en memoria como DOM o árboles similares).

Licencia

La especificación está marcada como "Copyright © 2003, 2006 - 2009 Oracle. Todos los derechos reservados."

La especificación contiene dos licencias separadas: 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 toda la especificación, que no modifique ni extienda ninguna interfaz y que pase las pruebas de compatibilidad.

Esta disposición ha generado cierta controversia. En primer lugar, no se acepta universalmente que la implementación de una especificación publicada requiera una licencia (es decir, que la ley de derechos de autor lo prohíba en ausencia de una licencia). [ 20 ] [ 21 ] En segundo lugar, la licencia no cumple con los criterios para ser considerada una licencia de código abierto (véase Definición de código abierto ), debido a la prohibición de realizar extensiones y modificaciones. Esto ha llevado a algunos entusiastas del código abierto a cuestionar si las implementaciones de XQJ pueden considerarse verdaderamente de código abierto.

La licencia para la implementación de referencia es una licencia de código abierto bastante convencional, al estilo BSD.

Referencias

  1. 1 2 3 4 Modelo de datos XQuery 1.0 y XPath 2.0 (XDM)
  2. Vinculación de variables Java
  3. Consultas XML: XQuery, XPath y SQL/XML en contexto - Jim Melton y Stephen Buxton. ISBN 978-1558607118
  4. 1 2 XQJ - La API Java de XQuery está completa, Marc Van Cappellen, Zhen Hua Liu, Jim Melton y Maxim Orgiyan. Archivado el 28 de julio de 2012 en Wayback Machine.
  5. 1 2 IBM y Oracle envían una solicitud de especificación de Java para la API XQuery para Java (XQJ).
  6. 1 2 Un primer vistazo a la API XQuery para Java (XQJ) - Andrew Eisenberg, IBM y Jim Melton, Oracle. Archivado el 28 de julio de 2012 en Wayback Machine .
  7. El procesador XQuery de transmisión de BEA
  8. Interfaz XQJ para la base de datos XML nativa de Tamino. Archivada el 30 de mayo de 2013 en Wayback Machine.
  9. JSR-000225 API XQuery para Java (Versión final)
  10. Utilidad de actualización de XQuery
  11. Texto completo de XQuery
  12. API de MarkLogic XQJ
  13. API de eXist XQJ
  14. API BaseX XQJ
  15. API de Sedna XQJ
  16. Compatibilidad de Oracle XML DB con XQJ
  17. Software AG - Trabajar con la interfaz CentraSite XQJ
  18. Zorba 2.5 se envía con una esperada vinculación XQJ, 14 de junio de 2012
  19. Oracle XML Developer's Kit (XDK) proporciona un procesador XQuery 1.0 independiente para su uso por aplicaciones Java.
  20. "Estándares abiertos" (PDF) . Archivado del original (PDF) el 4 de marzo de 2016. Consultado el 7 de septiembre de 2023 .
  21. "Groklaw - Oracle v. Google - Entendiendo el problema de los derechos de autor con las especificaciones de la API" . www.groklaw.net . Archivado del original el 5 de mayo de 2012.
  • 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. Balisaje 2010
  • Formas de Orbeon usando XQJ Archivado el 22 de noviembre de 2012 en Wayback Machine
  • Compatibilidad con XQuery en Spring Integration
  • XQS: XQuery para Scala (se basa en XQJ)
  • Complemento de soporte para XQuery de IntelliJ