2008-11-17 4 views
7

XML-файл, который я хочу, чтобы разобрать начинается с:Java SAX Parser поднимает UnknownHostException

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

Так что, когда я начинаю SAX praser, он пытается получить доступ к этой ОТД онлайн, и я получаю 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); 

ответ

0

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

0

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

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

Ус

10

Хорошо, получается, метод 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("")); 
     } 
    }); 
+0

Этот ответ работает как есть – jkschneider 2011-05-25 16:15:53

1

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

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

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