2008-11-17 51 views
7

我想分析開頭的XML文件:Java的SAX分析器引發的UnknownHostException

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

所以,當我開始SAX praser,它會嘗試在網上訪問該DTD,我得到了的java.net.UnknownHostException 。

  1. 將其送入SAX解析器
  2. 我有那麼它不與沒有互聯網連接

我怎樣才能改變SAX解析器的行爲甚至可以運行之前,我不能修改XML文件嘗試加載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(只要你將它們與你的應用程序一起發貨)。否則,像Gowri建議的那樣返回null。您可能需要閱讀the API doc

YC

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一起使用,但由於某些原因它不適用。