2011-01-18 19 views
10

上のDTDスキーマとXMLファイルの解析:私は次のエラーを取得するは、私は次のJavaコードを持っている相対パス

 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE archive SYSTEM "../../schema/xml/schema.dtd"> 
... 

 

DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document doc=db.parse(new File("/opt/myfile")); 
 

そして/opt/myfileのようなものが含まれています

 
java.io.FileNotFoundException: /../schema/xml/schema.dtd (No such file or directory) 

これは、他の場所で作成されたXMLファイルを消費する大きなJavaフレームワークです。私は相対的な道が問題だと思う。私は、JVMが起動する前にcwdを変更することは受け入れられないと考えています(パスはJVM自身が読み込んだ設定ファイルから来ています)、JVMの実行中にcwdを変更する方法が見つかりませんでした。このXMLファイルを適切なDTDで解析するにはどうすればよいですか?

答えて

17

DTDのパスを微調整するためにカスタムEntityResolverを使用する必要があります。たとえば、次のように

db.setEntityResolver(new EntityResolver() { 
    @Override 
    public InputSource resolveEntity(String publicId, String systemId) 
      throws SAXException, IOException { 
     if (systemId.contains("schema.dtd")) { 
      return new InputSource(new FileReader("/path/to/schema.dtd")); 
     } else { 
      return null; 
     } 
    } 
}); 

schema.dtdがクラスパス上にある場合は、あなただけの完全なパスを指定せずに、それをロードするためにgetResourceAsStreamを使用することができます。

return new InputSource(Foo.class.getResourceAsStream("schema.dtd")); 
+1

でも、カタログベースのリゾルバを使用することもできます。 –

+0

すぐに使用できるリゾルバの例:[org.hibernate.util.DTDEntityResolver](http://stackoverflow.com/questions/10886453/hibernate-issue-with-using-http-www-hibernate-org-dtd) – Vadzim

0

上記の例のようにカスタムEntityResolverを使用しましたが、それでも別のベースディレクトリのDTDファイルを検索しました。だから私はそれをデバッグし、私はuser.dirのシステムプロパティを変更する必要があることを知った。だから私はこの行を私のアプリケーションの初期化メソッドに追加して、今動作します。

System.setProperty("user.dir") 
関連する問題