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

如何使Java的javax XML解析器严格校验所有XML语法违规?

如何让javax XML解析器严格检查XML语法违规

要让javax自带的XML解析器严格检测所有语法违规,需要从启用验证模式和自定义错误处理两方面入手——默认配置下解析器仅做宽松的语法检查,会忽略部分不规范写法。

修改后的代码示例

import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.ByteArrayInputStream;
import java.io.IOException;

public class StrictXmlParser {
    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(false);
        // 启用验证模式,开启严格语法检查
        factory.setValidating(true);

        // 配置解析器特性,确保严格遵循XML规范,同时避免加载外部DTD
        try {
            factory.setFeature("http://xml.org/sax/features/validation", true);
            factory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
            factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
        } catch (ParserConfigurationException e) {
            throw new RuntimeException("Failed to configure XML parser features", e);
        }

        DocumentBuilder builder = factory.newDocumentBuilder();
        // 自定义错误处理器:将所有警告、错误转为异常抛出,中断解析并报错
        builder.setErrorHandler(new ErrorHandler() {
            @Override
            public void warning(SAXParseException e) throws SAXException {
                throw e;
            }

            @Override
            public void error(SAXParseException e) throws SAXException {
                throw e;
            }

            @Override
            public void fatalError(SAXParseException e) throws SAXException {
                throw e;
            }
        });

        String oops = "<xml><oops></oops>></xml>";
        ByteArrayInputStream stream = new ByteArrayInputStream(oops.getBytes());
        builder.parse(stream);
    }
}

关键配置说明

  • setValidating(true):开启解析器的验证功能,默认关闭状态下解析器仅做基础语法校验,会忽略如多余符号这类不规范写法。
  • SAX特性配置:通过设置http://xml.org/sax/features/validation确保解析器严格执行XML规范,另外两个特性用于禁用外部DTD加载,避免依赖外部资源且加快解析速度。
  • 自定义ErrorHandler:默认的错误处理器仅打印错误信息但不中断解析,自定义后任何警告、错误都会直接抛出SAXParseException,测试时能立即捕获语法违规问题。

修改后,原代码中</oops>></xml>里的多余>会触发异常,实现严格的语法校验。

内容的提问来源于stack exchange,提问作者Phlip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:39:23