2008-11-26 49 views
0

我有使用下面的DOCTYPE如何在將使用getResourceAsStream()加載的XML文件中包含DTD?

<!DOCTYPE video-faq SYSTEM "videofaq.dtd"> 

我使用從類路徑加載文件(實際上是從一個JAR)在Servlet的初始化時間定義了一個DTD的XML文件(「videofaq.xml」):

getClass().getResourceAsStream("videofaq.xml") 

XML是正確地找到,但對於DTD在同一個包,Xerces的給了我一個FileNotFoundException異常,並與追加到末尾「videofaq.dtd」顯示到Tomcat啓動腳本路徑。有什麼提示,如果有的話,我可以傳遞給Xerces使其正確加載DTD?

回答

1

定製的EntityResolver可以工作,但是您可以通過設置SystemID來允許處理器「查找」相對路徑來避免創建自定義類。

http://www.onjava.com/pub/a/onjava/excerpt/java_xslt_ch5/index.html?page=5

通過提供一個系統標識符作爲參數 到StreamSource的,你是 告訴XSLT處理器在哪裏 找commonFooter.xslt。如果沒有 此參數,那麼當處理器不能 解析此URI時,可能會遇到 錯誤。簡單的解決方法是 呼叫setSystemId()方法 如下:

// construct a Source that reads from an InputStream 
Source mySrc = new StreamSource(anInputStream); 
// specify a system ID (a String) so the 
// Source can resolve relative URLs 
// that are encountered in XSLT stylesheets 
mySrc.setSystemId(aSystemId); 
1

當你

getClass().getResourceAsStream("videofaq.xml") 

這不是XERCES您呼叫正因爲如此,當你給流的Xerces,它無法知道文件是從加載。它從應用程序根路徑(您已經描述過)加載它。

一個簡單的解決方案是將xml文件中的整個路徑指定給dtd。

此外,xerces似乎嘗試多個地方。所以你應該看看語法緩存機制或實體解析器(按照我認爲的順序使用)。

的Xerces語法DOC:http://xerces.apache.org/xerces2-j/faq-grammars.html

的Xerces特性利用實體-resolver2:http://xerces.apache.org/xerces2-j/features.html

0

當使用SAX您可以提供自己的EntityResolver然後加載的資源,你想要的任何方式。

0

通常,在爲XML解析器指定輸入時,嘗試使用接受URL的方法重載(通常將其作爲帶有參數名稱的字符串,如「systemId」)。這允許解析器爲您解析相對引用,並提供更好的錯誤消息。

因此,就您的情況而言,請使用videofaq.xml在同一個包中找到DTD,並將getClass().getResource("videofaq.xml")String結果傳遞給XML解析器。

相關問題