2009-05-11 6 views
1

Ich werde jetzt darauf hinweisen, dass ich neu bei der Verwendung von Saxon bin, und ich habe versucht, die Dokumente und Beispiele in dem Paket zu folgen, aber ich habe einfach nicht Glück mit diesem Problem.Saxon 8 (Java-Version) Problem

Im Grunde versuche ich einige XML-Verarbeitung in Java mit Sachson V8. Um etwas zum Laufen zu bringen, nahm ich eine der im Paket enthaltenen Beispieldateien und modifizierte sie nach meinen Bedürfnissen. Es funktioniert, solange ich keine Namespaces verwende, und das ist meine Frage. Wie kann ich das Namespace-Problem umgehen? Ich verwende es nicht wirklich, aber es existiert in meinem XML, also muss ich es entweder benutzen oder es ignorieren. Jede Lösung ist in Ordnung.

Wie auch immer, hier ist mein Startcode. Es macht nichts anderes als eine xpath-Abfrage zu versuchen, es gegen das fest codierte XML-Dokument zu verwenden.

public static void main(String[] args) { 
    String query = args[0]; 

    File XMLStream=null; 
    String xmlFileName="doc.xml"; 
    OutputStream destStream=System.out; 
    XQueryExpression exp=null; 
    Configuration C=new Configuration(); 
    C.setSchemaValidation(false); 
    C.setValidation(false); 

    StaticQueryContext SQC=new StaticQueryContext(C); 
    DynamicQueryContext DQC=new DynamicQueryContext(C);  
    QueryProcessor processor = new QueryProcessor(SQC); 
    Properties props=new Properties(); 
    try{ 
     exp=processor.compileQuery(query); 
     XMLStream=new File(xmlFileName); 
     InputSource XMLSource=new InputSource(XMLStream.toURI().toString()); 
     SAXSource SAXs=new SAXSource(XMLSource); 
     DocumentInfo DI=SQC.buildDocument(SAXs); 
     DQC.setContextNode(DI); 

     SequenceIterator iter = exp.iterator(DQC); 
     while(true){ 
      Item i = iter.next(); 
      if(i != null){ 
       System.out.println(i.getStringValue()); 
      } 
      else break; 
     } 
    } 
    catch (Exception e){ 
     System.err.println(e.getMessage()); 
    } 
} 

Ein Beispiel XML-Datei hier ist ...

<?xml version="1.0"?> 
<ns1:animal xmlns:ns1="http://my.catservice.org/"> 
    <cat> 
     <catId>8889</catId> 
     <fedStatus>true</fedStatus> 
    </cat> 
</ns1:animal> 

Wenn ich dies mit einer Abfrage mit dem Namespace ausführen, bekomme ich einen Fehler. Zum Beispiel: /ns1:animal/cat/ gibt den Fehler: "Prefix ns1 wurde nicht deklariert".

Wenn ich die ns1: aus der Abfrage entfernen, gibt es mir nichts. Wenn ich das xml behandle, um das "ns1:" zu entfernen, das "Tier" vorangestellt wird, kann ich die Abfrage /animal/cat/ mit Erfolg laufen lassen.

Jede Hilfe würde sehr geschätzt werden. Vielen Dank.

Antwort

2

Die Fehlermeldung weist richtig darauf hin, dass Ihr Xpath-Ausdruck nicht angibt, was Namespacepräfix "ns1" bedeutet (bindet an). Nur weil das zu verwendende Dokument bindend für "ns1" verwendet, bedeutet das nicht, dass es verwendet werden sollte: weil in XML der Namespace-URI von Bedeutung ist und Präfixe nur bequeme Abkürzungen zur echten Sache sind.

Also: Wie definieren Sie die Bindung? Es gibt 2 generische Wege; Stellen Sie entweder einen Kontext bereit, der das Präfix auflösen kann, oder binden Sie den tatsächlichen URI in den XPath-Ausdruck ein.

In Bezug auf den ersten Ansatz this email von Saxon Autor erwähnt JAXP Methode XPath.setNamespaceContext() ähnlich, hat Jaxen XPath processor FAQ einige Beispielcode, der helfen könnte, die nicht sehr bequem ist, wie Sie NamespaceContext implementieren müssen, aber sobald Sie haben eine Implementierung werden Sie festgelegt werden.

So ist die Notation Ansatz ... mal sehen: Top Ten Tips to Using XPath and XPointer zeigt dieses Beispiel:

xmlns:

Element mit Namensraum wie erklärt übereinstimmen Buch = "http://my.example.org/ Namespaces/Buch“

Sie verwenden XPath Namen wie:

{http://my.example.org/namespaces/book} Abschnitt

die hoffentlich wird von Saxon (oder Jaxen) verstanden.

Schließlich würde ich empfehlen, wenn möglich auf Saxon9 zu aktualisieren, wenn Sie irgendwelche Probleme mit einer der oben genannten Lösungen haben.

0

Wenn Sie etwas aus der Box haben möchten, können Sie embedding-xquery-in-java ausprobieren.Es gibt Github-Projekt, das Saxon verwendet, um einige Beispiel-XQuery-Ausdrücke zu bewerten.

Grüße