2012-03-31 5 views
3

Ich verwende BaseX native XML-Datenbank zum Abfragen von XML-Dateien. Ich verwende die BaseXClient.java-Datei in der BaseX-Dokumentation. Ich starte den Basex-Server und verbinde mich mit BaseXClient.java zum Server.Abfragen von XML-Dateien mit BaseX

// create session 
final BaseXClient session = new BaseXClient("localhost", 1984, "admin", "admin"); 

String query = "doc('xmlfiles/juicers.xml')//image"; 
// version 1: perform command and print returned string 
System.out.println(session.execute(query)); 

Jetzt hat die Juicers.xml-Datei Informationen xmlns.

<?xml version="1.0"?> 
<juicers 
xmlns="http://www.juicers.org" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.juicers.org 
        juicers.xsd"> 

<juicer> 
    <name>OJ Home Juicer</name> 
    <image>images\mighty_oj.gif</image> 
    <description>There&apos;s just no substitute for a properly squeezed 
     orange in the morning. So delicate and refreshing. The finest hotels 
     use mechanical juicers of this type for their most discriminating 
     guests. This is the largest selling juicer of its kind. It&apos;s a 
     beautiful little all-metal piece in baked enamel and polished chrome; 
     it even won the Frankfurt Fair Award for its design. Uses no 
     electricity and produces no non-recyclable waste as do frozen juices. 
    </description> 
    <warranty>lifetime warranty</warranty> 
    <cost>41.95</cost> 
    <retailer>http://www.thewhitewhale.com/oj.htm</retailer> 
</juicer> 
</juicers> 

Wenn ich nicht die xmlns in XML-Instanzdatei (juicers.xml) geben, gibt sie mir korrekte Ergebnisse. Wenn jedoch xmlns in der XML-Instanzdatei enthalten ist, wird die folgende Ausnahme ausgelöst.

java.io.IOException: Stopped at line 1, column 3: 
Expecting command. 
at org.basex.api.BaseXClient.execute(BaseXClient.java:73) 
at org.basex.api.BaseXClient.execute(BaseXClient.java:84) 
at org.basex.api.Example.main(Example.java:31) 

Wie abfragen ich XML-Instanzen Dateien mit xmlns? Gibt es einen Ausweg? Gibt es eine andere Möglichkeit, xquery von Java auszuführen?

Antwort

3

Neben Chrstian Antwort Sie müssen entweder einen Standard-Element-Namespace deklarieren oder den Namespace jedes Mal verwenden, wenn Sie ein Element adressieren (wahrscheinlich, wenn Sie mehrere Namespaces in Ihrem Dokument haben).

Der Namespace Standard-Element können Sie Ihre Abfrage schreiben, wie Sie oben haben:

declare default element namespace "http://www.juicers.org"; 
doc('xmlfiles/juicers.xml')//image 

Wenn Sie möchten, um es als Namensraum nicht juicers als Standardelement Namespace verwenden, deklarieren und auf Elementebene verweisen :

declare namespace juicers="http://www.juicers.org"; 
doc('xmlfiles/juicers.xml')//juicers:image 

Sie die Namespace-Kennung juicers beliebig eingestellt werden.

1

Sie benötigen eine Abfrage mit dem XQUERY Befehl Präfix:

System.out.println(session.execute("XQUERY " + query)); 

Eine weitere Option ist es, eine „Abfrage“ Instanz zu erstellen und query.execute() danach rufen:

BaseXClient.Query query = session.query(query); 
System.out.println(query.execute()) 
+0

danke. Aber ich kann nur abfragen, wenn im XML-Instanzdokument kein XML-Namespace definiert ist oder wenn in der XML-Instanzdatei kein Speicherort für die Schemadatei angegeben ist. Ich Anwesenheit der oben genannten, kein Ergebnis zurückgegeben wird. Gibt es einen bestimmten Grund für dieses Verhalten? –