【问题标题】:Java SAX Parser raises UnknownHostExceptionJava SAX 解析器引发 UnknownHostException
【发布时间】:2010-09-22 16:26:54
【问题描述】:

我要解析的 XML 文件以 :

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

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

  1. 在将 XML 文件提供给 SAX 解析器之前,我无法修改它
  2. 即使没有互联网连接我也必须运行

如何更改 SAX 解析器的行为,使其不尝试加载 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);

【问题讨论】:

    标签: java dtd sax


    【解决方案1】:

    您可以实现自定义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。我认为这应该可以解决这个问题。

    【讨论】:

      【解决方案2】:

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

      您可能想阅读the API doc。

      yc

      【讨论】:

        【解决方案3】:

        好的,结果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(""));
                }
            }); 
        

        【讨论】:

          【解决方案4】:

          使用 XMLReader 代替 SAXParser。

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

          它也应该适用于 SAXParser,但由于某些原因它不能。

          【讨论】:

            猜你喜欢
            • 2013-10-10
            • 2012-03-01
            • 2015-09-28
            • 2015-02-15
            • 2017-08-19
            • 1970-01-01
            • 2012-01-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多