Java SAX解析器引发UnknownHostException异常

7

The XML file I want to parse starts with :

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

当我启动SAX解析器时,它试图在线访问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个回答

11

好的,原来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

使用XMLReader代替SAXParser。

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

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


0

你应该提供一个EntityResolve来解决这个问题。我建议你编写一个解析器,它将知道如何本地读取DTD(如果你已经将它们与你的应用程序一起发布)。否则,就像Gowri建议的那样返回null。

你可能想阅读API文档

yc


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即可。我认为这应该可以解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接