2013-04-21 110 views
3

我有一個XML文件,該文件中有一個DTD引用,就像這樣:如何根據給定的DTD文件驗證XML文件?

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

我使用的是DocumentBuilderFactory

public static Document validateXMLFile(String xmlFilePath) throws ParserConfigurationException, SAXException, IOException { 
    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
    domFactory.setValidating(true); 
    DocumentBuilder builder = domFactory.newDocumentBuilder(); 
    builder.setErrorHandler(new ErrorHandler() { 
     @Override 
     public void error(SAXParseException exception) throws SAXException { 
      // do something more useful in each of these handlers 
      exception.printStackTrace(); 
     } 

     @Override 
     public void fatalError(SAXParseException exception) throws SAXException { 
      exception.printStackTrace(); 
     } 

     @Override 
     public void warning(SAXParseException exception) throws SAXException { 
      exception.printStackTrace(); 
     } 
    }); 
    Document doc = builder.parse(xmlFilePath); 
    return doc; 
} 

但現在我想驗證對XML文件一個DTD文件在用戶定義的位置,而不是相對於XML文件的路徑。

我該怎麼做?

例子:

validateXMLFile("/path/to/the/xml_file.xml", "/path/to/the/dtd_file.dtd"); 
+0

可能的重複[使用Java驗證XML文件與本地DTD文件](http://stackoverflow.com/questions/1096365/validate-an-xml-file-against-local-dtd-file-with-java ) – 2013-04-21 23:30:36

+0

http://xmlsoft.org/xmllint.html:這似乎有一種方法來接受dtd的url並驗證xml。你應該檢查它的來源。 – Jayan 2013-04-22 01:36:52

回答

4

使用EntityResolver

final String dtd = "/path/to/the/dtd_file.dtd"; 
builder.setEntityResolver(new EntityResolver() { 
    public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { 
     if (systemId.endsWith("something.dtd")) { 
      return new InputSource(new FileInputStream(dtd)); 
     } 
     return null; 
    } 
}); 

請注意,只有當XML文檔具有DTD聲明時它才能工作。