Java SAX Parser вызывает исключение UnknownHostException

XML-файл, который я хочу проанализировать, начинается с:

<!DOCTYPE plist PUBLIC "-//...//DTD PLIST 1.0//EN" "http://www.....dtd">

Поэтому, когда я запускаю SAX praser, он пытается получить доступ к этому DTD в сети, и я получаю исключение java.net.UnknownHostException.

  1. Я не могу изменить XML-файл, прежде чем передать его синтаксическому анализатору SAX
  2. Мне нужно бежать даже без подключения к интернету

Как я могу изменить поведение 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);
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
0
5 546
4

Ответы 4

Вы можете реализовать собственный 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, но по некоторым причинам это не так.

Другие вопросы по теме