2009-05-11 15 views
1

私はsaxonを使い慣れていないことを指摘していますが、パッケージのドキュメントと例を試してみましたが、問題。Saxon 8(Java版)の問題

基本的に、私はsaxon v8を使ってjavaでいくつかのxml処理をしようとしています。何か動作するためには、パッケージに含まれているサンプルファイルの1つを取り出し、必要に応じて修正しました。私が名前空間を使用していない限り、それは動作します、それは私の質問です。名前空間の問題を回避するにはどうすればよいですか?私は本当にそれを使用する気にしないが、私のXMLに存在するので、私はそれを使用するか無視する必要があります。どちらの解決策でも問題ありません。

とにかく、ここに私のスターターコードです。それは何もしませんが、xpathクエリをハードコードされたxmlドキュメントに対して使用しようとします。

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()); 
    } 
} 

例のXMLファイルはここにある...

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

私は名前空間を含むクエリでこれを実行すると、私はエラーを取得します。たとえば、 /ns1:animal/cat/には、「接頭辞ns1が宣言されていません」というエラーが表示されます。

ns1:をクエリから削除すると、何も表示されません。私が動物の前に "ns1:"を取り除くためにxmlを医者にしたら、私は質問/animal/cat/を成功裏に走らせることができます。

ご協力いただければ幸いです。ありがとう。

答えて

2

エラーメッセージは、xpath式が接頭辞 "ns1"の意味(バインド先)を示していないことを正しく示しています。操作するドキュメントが "ns1"のバインディングを使用しているからといって使用する必要があるわけではありません。これはXMLでは重要な名前空間URIであり、接頭辞は実際の便利なショートカットです。

So:バインディングをどのように定義しますか? 2つの一般的な方法があります。接頭辞を解決できるコンテキストを提供するか、XPath式内に実際のURIを埋め込みます。サクソンの著者からの最初のアプローチ、this emailについて

は、JAXP方法XPath.setNamespaceContextを()言及し、同様に、Jaxen XPath processor FAQはあなたがNamespaceContextを実装するために持っているように、非常に便利ではありません を助けることができるいくつかのサンプルコードがありますが、持っていたら、実装が設定されます。

ので、表記のアプローチ...見てみましょう:Top Ten Tips to Using XPath and XPointerは、この例を示します。

のxmlns:

要素を一致させるためには、のような名前空間で宣言された著書= "http://my.example.org/名前空間/著書」

あなたのようなXPathの名を使用します。

うまくいけば{} http://my.example.org/namespaces/bookセクション

サクソン(またはヤクセン)によって理解される。

最後に、上記のソリューションのいずれかを使用する際に問題がある場合は、可能であればSaxon9にアップグレードすることをお勧めします。

0

箱から何かを取り出したい場合は、embedding-xquery-in-javaをご覧ください。Saxonを使っていくつかのサンプルXQuery式を評価するgithubプロジェクトがあります。

よろしくお願いいたします。

関連する問題