7

我要解析的 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);
4

4 回答 4

11

好的,结果证明该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(""));
        }
    }); 
于 2008-11-17T16:10:03.920 回答
1

使用 XMLReader 而不是 SAXParser。

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

它也应该与 SAXParser 一起使用,但由于某些原因它不能。

于 2011-10-10T13:04:54.833 回答
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。我认为这应该可以解决这个问题。

于 2008-11-17T15:20:55.907 回答
0

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

您可能需要阅读API 文档

yc

于 2008-11-17T15:32:59.923 回答