2012-05-21 12 views
5

私はwoodstoxを使ってXMLファイル用のStAXパーサを実装しています。私は、ファイルシステムの共通のディレクトリのどこかにDTDが一致する有効なXMLファイルがあると仮定します。次のように相対的なシステム識別子の宣言を使用して、そのDTDに相対システムDTDをStAXパーサーにロードする方法は?

/path/to/test.xml 
/path/to/test.dtd 

XML参照:検証の観点から

<!DOCTYPE test SYSTEM "test.dtd"> 

は、すべてが私には罰金です。 (それは?xmllintは文句を言うことはありません)しかし、下のコードでファイルを解析しようとすると、woodstoxは相対DTDファイルを見つけることができないのでjava.io.FileNotFoundExceptionをスローします。実装は、XMLファイルオブジェクトに対してではなく、作業ディレクトリを基準にしてDTDファイルにアクセスしようとしているようです。

import java.io.FileInputStream; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamConstants; 
import javax.xml.stream.XMLStreamReader; 

public class Test { 

    public static void main(String[] args) throws Exception { 

     FileInputStream fileInputStream = new FileInputStream(args[0]); 
     XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory(); 
     XMLStreamReader xsr = xmlInputFactory.createXMLStreamReader(fileInputStream); 

     while(xsr.hasNext()) { 
      if(xsr.next() == XMLStreamConstants.DTD) { 
       System.err.println(xsr.getText()); 
      } 
     } 
    } 
} 
  1. これは意図的なものですか?
  2. StAXパーサに、作業ディレクトリからの相対ではなく、指定されたXMLファイルを基準としてDTDを読み込むようにするには便利な方法はありますか?

答えて

3

あなたはパーサがDTDを見つけるために(それはSAXの世界でEntityResolverとして知られています)XMLResolverインタフェースの独自の実装を提供する必要があるとしています。 XMLInputFactoryにはsetXMLResolver()という方法があります。

主題のいくつかのより多くの情報:

は、それはパーサは、システムを解決する必要があるときに起こっている正確に理解するためにボンネットの下に見てみるのもいいでしょうURI。例えば、ウッドストックスは、an internal (and a default) implementation of the XMLResolver(ならびにa proxy between the SAX's EntityResolver and a StAX XMLResolver)を有する。あなたのDTD "ファイル名"で何をしているのか見てみると、なぜそれが動作しているのか分かります。