2008-11-17 21 views
7

pliku XML chcę analizować zaczyna się od:Java SAX Parser podnosi UnknownHostException

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

Więc kiedy rozpocząć praser SAX, próbuje uzyskać dostęp do tego DTD online, a ja dostaję java.net.UnknownHostException .

  1. Nie mogę zmodyfikować plik XML przed wprowadzeniem go do parsera SAX
  2. muszę uruchomić nawet bez połączenia internetowego

Jak mogę zmienić zachowanie SAX Parser tak, że nie robi spróbuj załadować DTD? Dzięki.

javax.xml.parsers.SAXParserFactory factory = javax.xml.parsers.SAXParserFactory.newInstance(); 
factory.setValidating(false); 

javax.xml.parsers.SAXParser parser = factory.newSAXParser(); 
parser.parse(xmlFile, handler); 

Odpowiedz

0

można wdrożyć niestandardowe EntityResolver co jest, co jest wykorzystywane do wyszukiwania podmioty zewnętrzne podczas parsowania XML.

org.xml.sax.EntityResolver customEntityResolver = new DummyEntityResolver(); 
javax.xml.parsers.SAXParser parser = factory.newSAXParser(); 
parser.getXMLReader().setEntityResolver(customEntityResolver); 
parser.parse(xmlFile, handler); 

W swoim niestandardowym EntityResolver zawsze zwracaj wartość zerową. Myślę, że to powinno naprawić ten problem.

0

Powinieneś podać EntityResolve, aby rozwiązać problem. Zalecę napisanie programu do rozpoznawania nazw, który będzie umiał odczytywać pliki DTD lokalnie (pod warunkiem, że zostaną one wysłane razem z aplikacją). W przeciwnym razie zwrócony zostanie null, tak jak zasugerował Gowri.

Być może zechcesz przeczytać the API doc.

yc

10

Ok, okazuje metoda parse() zastępuje wszelkie wcześniejsze ustawienia resolwera jednostkę z obsługi przekazany do metody parse. Poniższy kod powinien zadziałać:

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

Ta odpowiedź działa tak, jak jest – jkschneider

1

Użyj XMLReader zamiast SAXParser.

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

Powinien także działać z SAXParser, ale z innych powodów tak nie jest.