簡體   English   中英

使用本地DTD驗證XML會引發錯誤

[英]Validating the XML with local DTD, throws error

我正在嘗試使用本地DTD驗證我的XML,我在Google上進行了搜索,然后得到了一些代碼,這是我的代碼。

public Document buildDocument(File receivedFile) {
    Document doc = null;
    try {
        logger.info("Inside buildDocument() , create a new DocumentBuilderFactory");
        // create a new DocumentBuilderFactory
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setValidating(true);
        // use the factory to create a documentbuilder
        DocumentBuilder builder = factory.newDocumentBuilder();
        builder.setErrorHandler(new ErrorHandler() {
            @Override
            public void fatalError(SAXParseException exception) throws SAXException {
                System.err.println("fatalError: " + exception);
            }

            @Override
            public void error(SAXParseException exception) throws SAXException {
                System.err.println("error: " + exception);
            }

            @Override
            public void warning(SAXParseException exception) throws SAXException {
                System.err.println("warning: " + exception);
            }
        });

        builder.setEntityResolver(new EntityResolver() {
            @Override
            public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
                if (systemId.contains("xyz.com/remote.dtd")) {
                    return new InputSource(FileUtils.readFileToString(
                            new File("C:\\Users\\xyz\\local.dtd"));
                } else {
                    return null;
                }
            }
        });
        doc = builder.parse(new InputSource(new StringReader(FileUtils.readFileToString(receivedFile, "UTF-16"))));
    } catch (ParserConfigurationException | SAXException | IOException e) {
        logger.warn("Opps got error while buiding document", e);
    }
    return doc;

我收到以下錯誤消息,我確定本地DTD可以與我要驗證的XML正常工作。 我找不到DTD的任何問題,但仍然收到此錯誤,請對此提供幫助。

> java.net.MalformedURLException: no protocol: <!DOCTYPE ichicsr [
> <!ENTITY lt     "&#38;#60;">
> 
> <!-- Greater Than ">" --> <!ENTITY gt     "&#62;"> 
> 
> <!-- Ampersand "&" --> <!ENTITY amp    "&#38;#38;">

然后打印整個DTD!

at java.net.URL.<init>(Unknown Source)
    at java.net.URL.<init>(Unknown Source)
    at java.net.URL.<init>(Unknown Source)
    at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:964)
    at org.apache.xerces.impl.XMLEntityManager.startEntity(XMLEntityManager.java:902)
    at org.apache.xerces.impl.XMLEntityManager.startDTDEntity(XMLEntityManager.java:869)
    at org.apache.xerces.impl.XMLDTDScannerImpl.setInputSource(XMLDTDScannerImpl.java:241)
    at org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(XMLDocumentScannerImpl.java:1001)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:324)
    at org.apache.xerces.parsers.XML11Configuration.parse(XML11Configuration.java:875)
    at org.apache.xerces.parsers.XML11Configuration.parse(XML11Configuration.java:798)
    at org.apache.xerces.parsers.XMLParser.parse(XMLParser.java:108)
    at org.apache.xerces.parsers.DOMParser.parse(DOMParser.java:230)

注意:我的XML編碼類型為UTF-16

更新:在讀取文件時刪除了UF-16,看起來DTD試圖進行編譯,並且由於錯誤而使我失望,

latin-entities.dtd(系統找不到指定的路徑)

這是否意味着此DTD正在尋找依賴的DTD?

我猜問題出在這里:

if (systemId.contains("xyz.com/remote.dtd")) {
    return new InputSource(FileUtils.readFileToString(
                     new File("C:\\Users\\xyz\\local.dtd"));

假設FileUtils.readFileToString()返回文件內容作為字符串。

XMLEntityManager期望InputSource提供一個系統ID作為URL,但是它將獲取文件內容,因此是MalformedURLException。

根據文件的URL創建一個InputSource

new InputSource(new File(...).toURI().toASCIIString()

或使用StringReader在文件內容上創建InputSource

new InputSource(new StringReader(FileUtils....))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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