XML-файл, который я хочу проанализировать, начинается с:
<!DOCTYPE plist PUBLIC "-//...//DTD PLIST 1.0//EN" "http://www.....dtd">
Поэтому, когда я запускаю SAX praser, он пытается получить доступ к этому DTD в сети, и я получаю исключение java.net.UnknownHostException.
Как я могу изменить поведение SAX Parser, чтобы он не пытался загрузить DTD? Спасибо.
javax.xml.parsers.SAXParserFactory factory = javax.xml.parsers.SAXParserFactory.newInstance();
factory.setValidating(false);
javax.xml.parsers.SAXParser parser = factory.newSAXParser();
parser.parse(xmlFile, handler);




Вы можете реализовать собственный EntityResolver, который используется для поиска внешних сущностей во время синтаксического анализа XML.
org.xml.sax.EntityResolver customEntityResolver = new DummyEntityResolver();
javax.xml.parsers.SAXParser parser = factory.newSAXParser();
parser.getXMLReader().setEntityResolver(customEntityResolver);
parser.parse(xmlFile, handler);
И в вашем пользовательском EntityResolver просто всегда возвращайте null. Я думаю, это должно решить эту проблему.
Вы должны предоставить EntityResolve, чтобы решить проблему. Я рекомендую вам написать преобразователь, который будет знать, как читать DTD локально (при условии, что они поставляются вместе с вашим приложением). В противном случае верните null, как предложил Гоури.
Вы можете прочитать документ API.
yc
Хорошо, оказывается, что метод parse() переопределяет любые ранее установленные преобразователи сущностей с обработчиком, переданным методу синтаксического анализа. Следующий код должен работать:
javax.xml.parsers.SAXParserFactory factory = javax.xml.parsers.SAXParserFactory.newInstance();
factory.setValidating(false);
javax.xml.parsers.SAXParser parser = factory.newSAXParser();
parser.parse(new java.io.File("x.xml"), new org.xml.sax.helpers.DefaultHandler(){
public org.xml.sax.InputSource resolveEntity(String publicId, String systemId)
throws org.xml.sax.SAXException, java.io.IOException {
System.out.println("Ignoring: " + publicId + ", " + systemId);
return new org.xml.sax.InputSource(new java.io.StringReader(""));
}
});
Используйте XMLReader вместо SAXParser.
XMLReader reader =XMLReaderFactory.createXMLReader();
reader.setEntityResolver(new DummyEntityResolver());
reader.setContentHandler(handler);
reader.parse(inputSource);
Он также должен работать с SAXParser, но по некоторым причинам это не так.