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

设置TransformerFactory特性时遇TransformerConfigurationException错误求助

解决TransformerFactory设置disallow-doctype-decl特性失败的问题

我之前也碰到过一模一样的报错,其实问题的核心很清晰:你尝试设置的http://apache.org/xml/features/disallow-doctype-decl是XML解析器(比如Xerces)的特性,用来禁止DOCTYPE声明以防范XXE攻击,但你直接调用了TransformerFactory的setFeature()方法——而Xalan的TransformerFactoryImpl根本不支持这个特性,所以才会抛出TransformerConfigurationException。

下面给你两种可行的解决思路:

方法一:通过关联配置好的SAXParserFactory实现特性

这种方法是把配置了目标特性的SAXParserFactory绑定到TransformerFactory,让Transformer在解析XML时使用这个已配置的解析器:

import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.TransformerFactory;

public class TransformerSetup {
    public static TransformerFactory mytFactory;

    public static void initTransformerFactory() throws Exception {
        // 1. 创建SAXParserFactory并设置disallow-doctype-decl特性
        SAXParserFactory saxFactory = SAXParserFactory.newInstance();
        saxFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
        saxFactory.setNamespaceAware(true); // 通常建议开启命名空间支持

        // 2. 创建TransformerFactory并关联SAXParserFactory
        mytFactory = TransformerFactory.newInstance();
        mytFactory.setAttribute(
            "http://javax.xml.XMLConstants/property/SAXParserFactory", 
            saxFactory
        );
    }
}

方法二:直接配置XMLReader并绑定到TransformerFactory

如果你更倾向于直接操作XMLReader,也可以用这种方式:

import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import javax.xml.transform.TransformerFactory;

public class TransformerSetup {
    public static TransformerFactory mytFactory;

    public static void initTransformerFactory() throws Exception {
        // 1. 创建XMLReader并设置目标特性
        XMLReader xmlReader = XMLReaderFactory.createXMLReader();
        xmlReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

        // 2. 将配置好的XMLReader绑定到TransformerFactory
        mytFactory = TransformerFactory.newInstance();
        mytFactory.setAttribute(
            "http://javax.xml.transform.sax.SAXSource/XMLReader", 
            xmlReader
        );
    }
}

额外提示

  • 确保你的项目中引入了支持该特性的XML解析器(比如Apache Xerces),如果用的是JDK自带的解析器,部分版本也支持这个特性,但建议明确依赖以避免版本兼容问题。
  • 不要混淆XSLT TransformerFactory的特性和XML解析器的特性:前者负责XSLT转换相关的配置,后者才是处理XML解析层面的安全特性。

内容的提问来源于stack exchange,提问作者Manjunath H M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:14:29