dtd解析开销更小,因其语法简单、无命名空间和数据类型校验,仅需基础标签匹配与实体检查,且dtd非xml格式,可用轻量词法器处理,无需加载编译schema模型。
DTD 验证通常更快,但代价是功能阉割和结构僵化
为什么 DTD 解析开销更小?
DTD 语法简单、无命名空间、无数据类型校验,解析器(如 JAXP 中的 DocumentBuilderFactory)只需做基础标签匹配和实体声明检查,不涉及 XML Schema 的类型推导、facet 校验或命名空间绑定等步骤。
- DTD 文件本身不是 XML,解析器用专用轻量词法器处理,跳过通用 XML 解析流程
- 不需加载和编译 Schema 模型(
SchemaFactory.newSchema()是个耗时操作) - 无
xs:complexType层级展开、无xs:import/xs:include依赖解析
XSD 验证慢在哪几个关键环节?
真正拖慢 XSD 验证的不是“校验动作本身”,而是前期准备和规则复杂度:
-
SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema")初始化较重,尤其首次调用会触发类加载和内部缓存构建 - 每次
schema.newValidator()都可能触发 Schema 编译(除非复用Schema实例) - 遇到
xs:pattern、xs:minLength、xs:enumeration等约束时,需对每个文本节点做正则匹配或枚举比对 - 多命名空间 +
xs:import的 XSD,加载时间呈线性增长,且容易因resolveResource回调未实现而卡住
实测对比:一个典型 Spring Bean XML 的验证耗时差异
以含 50 个 <bean></bean> 的 XML 文件为例(JDK 17 + Xerces 2.12.2):