2013-04-21 1 views
3

У меня есть файл XML, который имеет ссылку на DTD в нем, как это:Как проверить файл XML на данный DTD-файл?

<?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

Возможный дубликат [Проверка файла XML с локальным файлом DTD с Java] (http://stackoverflow.com/questions/1096365/validate-an-xml-file-against-local-dtd-file-with-java) –

+0

http://xmlsoft.org/xmllint.html: Кажется, у него есть способ принять URL-адрес dtd и проверить XML-файл. Вы должны проверить его источник. – Jayan

ответ

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.

 Смежные вопросы

  • Нет связанных вопросов^_^