XQuery API til Java - XQuery API for Java
| Udvikler (r) | Java-fællesskabsproces |
|---|---|
| Stabil frigivelse | 1.0 / 24. juni 2009
|
| Type | API til dataadgang |
| Internet side | JSR 225: XQuery API til Java |
XQuery API til Java ( XQJ ) henviser til den fælles Java API til W3C XQuery 1.0-specifikationen.
XQJ API gør det muligt for Java-programmører at udføre XQuery mod en XML -datakilde (f.eks. En XML-database ), mens reduktion eller eliminering af leverandørlåsning reduceres .
XQJ API giver Java-udviklere en grænseflade til XQuery Data Model. Dens design svarer til JDBC API, som har en klient / server-følelse, og som sådan egner sig godt til Serverbaserede XML-databaser og mindre godt til XQuery- processorer på klientsiden , selvom " forbindelses " -delen er en meget mindre del af hele API. Brugere af XQJ API kan binde Java- værdier til XQuery- udtryk, hvilket forhindrer angreb af kodeinjektion . Flere XQuery- udtryk kan også udføres som en del af en atomtransaktion .
Historie og implementering
XQuery API til Java blev udviklet ved Java Community Process som JSR 225 . Det havde nogle store teknologibagere som Oracle , IBM , BEA Systems , Software AG , Intel , Nokia og DataDirect .
Version 1.0 af XQuery API for Java Specification blev udgivet den 24. juni 2009 sammen med JavaDocs , en referenceimplementering og et TCK (Technology Compatibility Kit), som implementerende leverandører skal overholde.
XQJ-klasser er indeholdt i Java-pakken javax.xml.xquery
Der er ingen (synlig) aktivitet for at oprette en version af XQJ, der understøtter XQuery 3.0 eller 3.1, for eksempel ved at levere Java-bindinger til tilføjelser til datamodellen, såsom funktioner, arrays eller kort.
Funktionalitet
XQJ tillader, at der findes flere implementeringer og bruges af den samme applikation.
XQJ-forbindelser understøtter oprettelse og udførelse af XQuery- udtryk. Udtryk opdateres muligvis og kan omfatte søgninger i fuld tekst. XQJ repræsenterer XQuery- udtryk ved hjælp af en af følgende klasser:
-
XQExpression- udtrykket sendes til XQuery-processoren hver gang. -
XQPreparedExpression- udtrykket er cachelagret, og eksekveringsstien er forudbestemt, så den kan udføres flere gange på en effektiv måde.
XQuery- udtryk returnerer en resultatsekvens af XDM-elementer, som i XQJ er repræsenteret gennem XQResultSequencegrænsefladen. Programmøren kan bruge en XQResultSequencetil at gå over individuelle XDM-emner i resultatsekvensen. Hvert element i sekvensen har XDM typeinformation tilknyttet, såsom dens nodetypen eksempel element(), document-node()eller en XDM atomar type, såsom xs:string, xs:integereller xs:dateTime. Oplysninger om XDM-typen i XQJ kan hentes via XQItemTypegrænsefladen.
Atomic XQuery- emner kan let kastes til Java- primitiver via XQItemAccessormetoder som getByte()og getFloat(). Også XQuery elementer og sekvenser kan føljeton til DOM Node , SAX ContentHandler , StAX- XMLStreamReader og den generiske IO Readerog InputStreamklasser.
Eksempler
Grundlæggende eksempel
Følgende eksempel illustrerer oprettelse af en forbindelse til en XML-database , indsendelse af et XQuery- udtryk og derefter behandling af resultaterne i Java . Når alle resultaterne er behandlet, lukkes forbindelsen for at frigøre alle tilknyttede ressourcer.
// 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();
Binding af en værdi til en ekstern variabel
Følgende eksempel illustrerer, hvordan en Java- værdi kan bindes til en ekstern variabel i et XQuery- udtryk. Antag, at forbindelsen connallerede findes:
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 ...
}
Standard datatypekortlægning
Kortlægning mellem Java- og XQuery- datatyper er stort set fleksibel, men XQJ 1.0-specifikationen har standardkortlægningsregler, der kortlægger datatyper, når de ikke er specificeret af brugeren. Disse kortlægningsregler har store ligheder med de kortlægningsregler, der findes i JAXB .
Den følgende tabel illustrerer standardregistreringsreglerne for, hvornår Java- værdier bindes til eksterne variabler i XQuery- udtryk.
| Java-datatype | Standard XQuery-datatype (r) |
|---|---|
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:dayTimeDurationhvis Durationobjektets tilstand erxs:dayTimeDuration
|
xs:yearMonthDurationhvis Durationobjektets tilstand erxs:yearMonthDuration
|
|
xs:durationhvis Durationobjektets tilstand erxs:duration
|
|
XMLGregorianCalendar
|
xs:datehvis XMLGregorianCalendarobjektets tilstand erxs:date
|
xs:dateTimehvis XMLGregorianCalendarobjektets tilstand erxs:dateTime
|
|
xs:gDayhvis XMLGregorianCalendarobjektets tilstand erxs:gDay
|
|
xs:gMonthhvis XMLGregorianCalendarobjektets tilstand erxs:gMonth
|
|
xs:gMonthDayhvis XMLGregorianCalendarobjektets tilstand erxs:gMonthDay
|
|
xs:gYearhvis XMLGregorianCalendarobjektets tilstand erxs:gYear
|
|
xs:gYearMonthhvis XMLGregorianCalendarobjektets tilstand erxs:gYearMonth
|
|
xs:timehvis XMLGregorianCalendarobjektets tilstand erxs: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()
|
Kendte implementeringer
Native XML-databaser
Følgende er en liste over indfødte XML-databaser, som det vides at have XQuery API til Java-implementeringer.
- MarkLogic
- eksisterer
- BaseX
- Sedna
- Oracle XDB
- Tamino
- TigerLogic
Relationelle databaser
DataDirect leverer XQJ- adaptere til relationsdatabaser ved at oversætte XQuery- kode til SQL med det samme og derefter konvertere SQL-resultatsæt til et format, der passer til XQJ til at behandle videre. Det følgende er et par kendte implementeringer.
Ikke-database implementeringer
Følgende er en liste over ikke-database XQuery- processorer, der leverer en XQuery API til Java-grænseflade (typisk tillader forespørgsel mod dokumenter, der er parset fra XML i filestore, og holdes i hukommelsen som DOM eller lignende træer).
- Saksisk XSLT- og XQuery-processor
- Zorba
- MXQuery
- Oracle XQuery-processor
Licens
Specifikationen er markeret som "Copyright © 2003, 2006 - 2009 Oracle. Alle rettigheder forbeholdes."
Specifikationen indeholder to separate licenser: en "specifikationslicens" og en "referenceimplementeringslicens".
Specifikationslicensen tillader gratis kopiering af specifikationen forudsat at meddelelser om ophavsret bevares; det giver også en licens til at oprette og distribuere en implementering af specifikationen, forudsat at den fuldt ud implementerer hele specifikationen, at den ikke ændrer eller udvider nogen grænseflader, og at den består kompatibilitetstestene.
Denne bestemmelse har skabt en vis kontrovers. For det første er det ikke almindeligt accepteret, at implementering af en offentliggjort specifikation er noget, der kræver en licens (det vil sige, at ophavsretsloven ikke vil tillade dette i mangel af en licens). For det andet opfylder licensen ikke kriterierne for at kvalificere sig som en open source-licens (se definitionen af open source ) på grund af forbuddet mod at foretage udvidelser og ændringer. Dette har fået nogle open source-entusiaster til at udfordre, om XQJ-implementeringer nogensinde kan betragtes som virkelig open source.
Licensen til referenceimplementeringen er en ret konventionel open source-licens i BSD-stil.
Referencer
eksterne links
- Javadoc til XQJ
- XQJ vejledning
- Bygger broer fra Java til XQuery, Charles Foster. XML Prag 2012 ( Prezi-præsentation )
- Java-integration af XQuery, Hans-Jürgen Rennau. Balisage 2010
- Orbeon Forms ved hjælp af XQJ
- Spring Integration XQuery Support
- XQS: XQuery for Scala (Sidder oven på XQJ)
- IntelliJ XQuery Support-plugin