XQuery API para Java

Content

História e implementação

A API XQuery para Java foi desenvolvida no processo da comunidade Java como JSR 225. Tinha alguns grandes patrocinadores de tecnologia, como Oracle, IBM, BEA Systems, Software AG, Intel, Nokia e Datadirect.

A versão 1.0 da API XQuery para a especificação Java foi lançada em 24 de junho de 2009, juntamente com o Javadocs, uma implementação de referência e um TCK (Kit de compatibilidade de tecnologia) aos quais os fornecedores implementadores devem estar em conformidade.

As classes XQJ estão contidas no pacote java javax.xml.xquery

Não há atividade (visível) para criar uma versão do XQJ que fornece suporte ao XQuery 3.0 ou 3.1, por exemplo, fornecendo ligações Java para adições ao modelo de dados, como funções, matrizes ou mapas.

Funcionalidade

O XQJ permite que várias implementações existam e sejam usadas pelo mesmo aplicativo.

As conexões XQJ suportam a criação e execução de expressões XQuery. As expressões podem estar atualizando e podem incluir pesquisas completas de texto. XQJ representa expressões XQuery usando uma das seguintes classes:

XQExpression – the expression is sent to the XQuery processor every time.XQPreparedExpression – the expression is cached and the execution path is pre-determined allowing it to be executed multiple times in an efficient manner.

O XQuery Expressions retorna uma sequência de resultados de itens XDM que em XQJ são representados através da interface XQResultEquence. O programador pode usar um XQResultEnquence para percorrer itens XDM individuais na sequência de resultados. Cada item na sequência possui informações do tipo XDM associadas a ele, como seu tipo de nó, por exemplo Element (), document-node () ou um tipo atômico XDM, como Xs: String, Xs: Inteiro ou XS: DateTime. As informações do tipo XDM no XQJ podem ser recuperadas através da interface xqitemtype.

Os itens atômicos XQuery podem ser facilmente lançados para as primitivas Java através de métodos xqitemaccessor, como getByte () e getfloat (). Além disso, os itens e seqüências XQuery podem ser serializados para o nó DOM, o SAX ContentHandler, o Stax XMLStreamReader e o leitor de IO genérico e as classes InputStream.

Exemplos

Exemplo básico

O exemplo a seguir ilustra a criação de uma conexão com um banco de dados XML, enviando uma expressão XQuery e processando os resultados em Java. Depois que todos os resultados forem processados, a conexão é fechada para liberar todos os recursos associados a ele.

// Crie uma nova conexão com um databasexqConnection conn = VendordataSource.getConnection ("myUser", "myPassword"); xqxpression expr = Conn.CreateExpression (); // Crie um resultado reutilizável de expressão XQuery ObjectXqResultEnquence = expr.executeQuery ("por $ n em fn: coleta ('catalog') // item" + "return fn: dados ($ n/nome)"); // Execute uma expressão xQuery // Processe a sequência de resultados iterativamentewhile (resultado.next ()) {// imprima o item atual no sequence System.out.println ("Nome do produto:" + resultado.getItemasstring (null)); } // Free todos os recursos criados pelo ConnectionConn.close ();

Vincular um valor a uma variável externa

O exemplo a seguir ilustra como um valor Java pode estar vinculado a uma variável externa em uma expressão XQuery. Assume que a conexão Conn já existe:

XQExpression expr = Conn.CreateExpression (); // A expressão XQuery a ser executada es = "Declare a variável $ x como xs: número inteiro externo;" + "por $ n em fn: coleta ('catálogo') // item" + "onde $ n/preço <= $ x" + "return fn: dados ($ n/nome)"; // vincula um valor ( 21) para uma variável externa com o qname xexpr.bindint (novo qname ("x"), 21, null); // executa o XQuery ExpressionXqResultEngEnce Result = Expr.executeQuery (s); // Processar o resultado (sequência) iterativamentewhile (Result.Next ()) {// Processe o resultado ...}

Mapeamento de tipo de dados padrão

O mapeamento entre os tipos de dados Java e XQuery é amplamente flexível, no entanto, a especificação XQJ 1.0 possui tipos de dados de mapeamento de regras de mapeamento padrão quando não são especificados pelo usuário. Essas regras de mapeamento têm grandes semelhanças com as regras de mapeamento encontradas no JAXB.

A tabela a seguir ilustra as regras de mapeamento padrão para vincular os valores de Java a variáveis ​​externas nas expressões XQuery.

Default conversion rules when mapping from Java data types to XQuery data typesJava DatatypeDefault XQuery Data Type(s)booleanxs:booleanbytexs:bytebyte[]xs:hexBinarydoublexs:doublefloatxs:floatintxs:intlongxs:longshortxs:shortBooleanxs:booleanBytexs:byteFloatxs:floatDoublexs:doubleIntegerxs:intLongxs:longShortxs:shortStringxs:stringBigDecimalxs:decimalBigIntegerxs:integerDurationxs:dayTimeDuration if the Duration Object's state is xs:dayTimeDurationxs:yearMonthDuration if the Duration Object's state is xs:yearMonthDurationxs:duration if the Duration Object's state is xs:durationXMLGregorianCalendarxs:date if the XMLGregorianCalendar Object's state is xs:datexs:dateTime if the XMLGregorianCalendar Object's state is xs:dateTimexs:gDay if the XMLGregorianCalendar Object's state is xs:gDayxs:gMonth if the XMLGregorianCalendar Object's state is xs:gMonthxs:gMonthDay if the XMLGregorianCalendar Object's state is xs:gMonthDayxs:gYear if the XMLGregorianCalendar Object's state is xs:gYearxs:gYearMonth if the XMLGregorianCalendar Object's state is xs:gYearMonthxs:time if the XMLGregorianCalendar Object's state is xs:timeQNamexs:QNameDocumentdocument-node(element(*, xs:untyped))DocumentFragmentdocument-node(element(*, xs:untyped))Elementelement(*, xs:untyped)Attrattribute(*, xs:untypedAtomic)Commentcomment()ProcessingInstructionprocessing-instruction()Texttext()

Implementações conhecidas

Bancos de dados XML nativos

A seguir, é apresentado uma lista de bancos de dados XML nativos, que são conhecidos por ter API XQuery para implementações Java.

MarkLogiceXistBaseXSednaOracle XDBTaminoTigerLogic

Bancos de dados relacionais

O DataDirect fornece adaptadores XQJ para bancos de dados relacionais, conversando o código XQuery para o SQL em tempo real e, em seguida, a conversão de resultados do SQL em um formato adequado para o XQJ processar ainda mais. A seguir, são apresentadas algumas implementações conhecidas.

Oracle DB (Not XDB)IBM Db2Microsoft SQL ServerSybase ASEInformixMySQLPostgreSQL

Implementações sem dados

A seguir, é apresentada uma lista de processadores não-Database XQuery, que fornecem uma API XQuery para a interface Java (normalmente permitindo a consulta contra documentos analisados ​​a partir de XML no FileStore e mantidos na memória como DOM ou árvores similares).

Saxon XSLT and XQuery processorZorbaMXQueryOracle XQuery Processor

Licença

A especificação é marcada como "Copyright © 2003, 2006 - 2009 Oracle. Todos os direitos reservados".

A especificação contém duas licenças separadas: uma "licença de especificação" e uma "licença de implementação de referência".

A licença de especificação permite a cópia gratuita da especificação, desde que os avisos de direitos autorais sejam retidos; Ele também concede uma licença para criar e distribuir uma implementação da especificação, desde que implemente totalmente toda a especificação, que não modifique ou estenda nenhuma interfaces e que passa nos testes de compatibilidade.

Esta disposição causou alguma controvérsia. Em primeiro lugar, não é universalmente aceito que a implementação de uma especificação publicada seja algo que requer uma licença (ou seja, que a lei de direitos autorais não perdoe isso na ausência de uma licença). Em segundo lugar, a licença não atende aos critérios para se qualificar como uma licença de código aberto (consulte a definição de código aberto), devido à proibição de fazer extensões e modificações. Isso levou alguns entusiastas de código aberto a desafiar se as implementações do XQJ podem ser consideradas verdadeiramente de código aberto.

A licença para a implementação de referência é uma licença de código aberto bastante convencional de BSD.