Java SAX Parser вызывает UnknownHostException - PullRequest
7 голосов
/ 17 ноября 2008

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);

Ответы [ 4 ]

10 голосов
/ 17 ноября 2008

Хорошо, получается, что метод 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(""));
        }
    }); 
1 голос
/ 10 октября 2011

Используйте XMLReader вместо SAXParser.

    XMLReader reader =XMLReaderFactory.createXMLReader();
 reader.setEntityResolver(new DummyEntityResolver());
    reader.setContentHandler(handler);
 reader.parse(inputSource);

Он также должен работать с SAXParser, но по некоторым причинам это не так.

0 голосов
/ 17 ноября 2008

Вы должны предоставить EntityResolve для решения проблемы. Я рекомендую вам написать распознаватель, который будет знать, как читать DTD локально (при условии, что они поставляются вместе с вашим приложением). В противном случае верните нуль, как предложил Гаури.

Возможно, вы захотите прочитать документ API .

Ус

0 голосов
/ 17 ноября 2008

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

...