簡體   English   中英

使用SAX解析器中的依賴項處理私有外部DTD

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM