[英]Handle private external DTD with dependencies in SAX parser
我正在嘗試使用DOCTYPE中指定的私有外部DTD來解析XML文件,如下所示:
<!DOCTYPE MY1 SYSTEM "my1.dtd">
為了在本地處理此DTD以進行驗證,我為XMLReader parser
指定了EntityResolver
:
//use local DTD
parser.setEntityResolver(new EntityResolver() {
@Override
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
if (systemId.contains(my1Dtd)) {
return new InputSource(MyClass.class.getResourceAsStream(MY1_DTD_RESOURCE_PATH));
} else {
return null;
}
}
});
此InputSource
正確返回,但是存在與DTD相關的問題:在DTD中,有對另一個DTD的引用。 因此,我將所有DTD放在同一包中。 但是,當我在Tomcat上部署我的應用程序FileNotFoundException D:\\apache-tomcat-6.0.29\\bin\\my2.dtd (The system cannot find the file specified)
,引發了該錯誤。
我的問題是:我們如何正確指定此依賴關系? 應該在它被構造resolveEntity
方法或I路徑犯了一個錯誤( my2.dtd
聲明為<!ENTITY % MY2 SYSTEM "my2.dtd">
內部my1.dtd
和存儲在同一個包中)。
該resolveEntity
當解析器需要加載my2.dtd文件應該被調用為好。
因此,您需要以類似的方式對其進行修改:
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
if (systemId.contains(my1Dtd)) {
return new InputSource(MyClass.class.getResourceAsStream(MY1_DTD_RESOURCE_PATH));
} else if (systemId.contains(my2Dtd)) {
return new InputSource(MyClass.class.getResourceAsStream(MY2_DTD_RESOURCE_PATH));
} else {
return null;
}
}
但是,為避免此類工作,您應該考慮使用解析器,例如Apache resolver 。 該解析器依賴於OASIS實體解析/ XML目錄 ,它允許您創建XML格式的目錄,由解析器讀取,這樣您就不必在每次擁有新的DTD或將其移至另一個DTD時都修改您的代碼。地方或其他。 (如果該解析器軟件包已經是您正在使用的解析器,則它與Apache Xerces發行版捆綁在一起)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.