XQuery API til Java - XQuery API for Java

XQJ
Udvikler (r) Java-fællesskabsproces
Stabil frigivelse
1.0 / 24. juni 2009 ( 2009-06-24 )
Type API til dataadgang
Internet side JSR 225: XQuery API til Java
Image
Generel arkitektur for, hvordan en XQJ-driver bruges til at kommunikere med en XML-database fra Java-applikationer.

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.

Standardkonverteringsregler ved kortlægning fra Java-datatyper til XQuery-datatyper
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.

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).

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