Java SAX Parser引发UnknownHostException

时间:2008-11-17 15:00:10

标签: java dtd sax

我要解析的XML文件以:

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

所以当我启动SAX praser时,它会尝试在线访问此DTD,并且我得到一个java.net.UnknownHostException。

  1. 我无法修改XML文件,然后再将其提供给SAX解析器
  2. 即使没有网络连接,我也必须运行
  3. 如何更改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 个答案:

答案 0 :(得分:10)

好的,事实证明,parse()方法会覆盖任何先前设置的实体解析器,并将处理程序传递给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 :(得分:1)

使用XMLReader而不是SAXParser。

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

它也适用于SAXParser,但由于某些原因它没有。

答案 2 :(得分: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。我认为应该解决这个问题。

答案 3 :(得分:0)

您应该提供EntityResolve以解决问题。我建议你编写一个解析器,知道如何在本地读取DTD(前提是你将它们与你的应用程序一起发送)。否则,像Gowri建议的那样返回null。

您可能想要阅读the API doc

YC