使用Java DOM Parser解析XML遇403 IOException错误,如何解决?
解决DOM解析XML时出现的403错误(无法获取testng-1.0.dtd)
你遇到的问题是Java DOM解析器尝试远程加载http://testng.org/testng-1.0.dtd时被服务器返回403拒绝访问。你的核心代码如下:
import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; // ... File file = new File("some/path"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.parse(file);
触发的错误提示:
java.io.IOException: Server returned HTTP response code: 403 for URL: http://testng.org/testng-1.0.dtd
这个问题本质是DOM解析器默认会验证XML引用的外部DTD并尝试远程加载,但目前testng官方的DTD地址已经限制了外部请求,给你两个可行的解决办法:
方法一:禁用外部DTD加载和验证(最简便)
如果你的场景不需要严格验证XML的DTD格式,直接关闭解析器的外部DTD加载和验证功能即可:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 关闭DTD验证逻辑 dbf.setValidating(false); // 禁止加载外部DTD文件 dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.parse(file);
这个方法无需额外文件,快速解决问题,适合只需要读取XML内容的场景。
方法二:本地引入testng-1.0.dtd文件(适合需要DTD验证的场景)
如果你必须保留DTD验证,可以先把testng-1.0.dtd下载到本地项目(比如放在src/main/resources目录下),然后通过自定义EntityResolver让解析器从本地读取资源:
import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; // ... DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); // 设置自定义实体解析器,优先从本地加载指定DTD db.setEntityResolver(new EntityResolver() { @Override public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { // 匹配testng的DTD远程地址 if ("http://testng.org/testng-1.0.dtd".equals(systemId)) { // 从本地资源文件读取,路径根据实际存放位置调整 return new InputSource(getClass().getResourceAsStream("/testng-1.0.dtd")); } // 其他DTD按默认逻辑处理 return null; } }); Document document = db.parse(file);
补充说明
出现这个错误的根源是你的XML文件头部引用了testng的DTD(类似<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">),而当前testng官方服务器拒绝了外部的DTD下载请求,上面两种方法分别从「跳过验证」和「本地替代」的角度解决了问题。
内容的提问来源于stack exchange,提问作者user2963365
相关产品推荐
相关产品推荐

