You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:33:16