我要解析的XML文件以:
开头<!DOCTYPE plist PUBLIC "-//...//DTD PLIST 1.0//EN" "http://www.....dtd">
所以当我启动SAX praser时,它会尝试在线访问此DTD,并且我得到一个java.net.UnknownHostException。
如何更改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);
答案 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