400 8949 560

NEWS/新闻

分享你我感悟

您当前位置> 主页 > 新闻 > 技术开发

Java SAXParserFactory怎么用 SAX解析器工厂方法

发表时间:2026-02-03 00:00:00

文章作者:畫卷琴夢

浏览次数:

SAXParserFactory 是 Java 中创建 SAX 解析器的工厂类,需三步使用:1. 调用 newInstance() 获取实例;2. 配置 namespace、禁用 DOCTYPE 等安全特性;3. 通过 newSAXParser() 创建解析器并配合 DefaultHandler 解析 XML。

SAXParserFactory 是 Java 中用于创建 SAX 解析器(SAXParser)的工厂类,它不直接解析 XML,而是负责配置和生成符合 SAX 规范的解析器实例。使用它需要三步:获取工厂实例、可选地设置安全/功能属性、创建解析器并配合 DefaultHandler 使用。

1. 创建 SAXParserFactory 实例

推荐用静态方法 SAXParserFactory.newInstan

ce() 获取工厂对象,它会自动查找并加载当前环境支持的默认实现(如 Xerces):

  • 无需硬编码具体实现类,便于移植
  • 如果类路径中存在多个 SAX 实现,JVM 按服务发现机制选择第一个可用的

2. 配置工厂(关键安全与功能选项)

为防止 XXE(XML 外部实体)攻击或启用命名空间支持,应在创建解析器前设置工厂属性:

  • setNamespaceAware(true):启用命名空间解析,让 startElement 中的 QName 和前缀生效
  • setValidating(false):关闭 DTD 验证(默认即为 false,显式设置更安全)
  • setFeature("http://apache.org/xml/features/disallow-doctype-decl", true):禁止 DOCTYPE 声明,防御 XXE
  • setFeature("http://xml.org/sax/features/external-general-entities", false):禁用外部通用实体

注意:部分 feature 在不同 JDK 版本或解析器中可能不被支持,调用前建议 try-catch 或先用 isSupportedFeature() 检查。

立即学习“Java免费学习笔记(深入)”;

3. 创建 SAXParser 并解析 XML

调用 newSAXParser() 得到解析器后,传入自定义的 DefaultHandler 子类处理事件:

  • 重写 startElement()endElement()characters() 等方法响应标签和文本
  • parser.parse(InputStream, handler)parse(File, handler) 启动解析
  • 若需传递系统属性(如自定义 EntityResolver),可用 parser.setProperty(...)

示例片段:

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
SAXParser parser = factory.newSAXParser();
parser.parse(new File("data.xml"), new MyHandler());

4. 注意事项与常见问题

SAX 是事件驱动、只读、单向流式解析,适合大文件但无法随机访问或修改文档:

  • 解析过程不可中断(除非抛异常),也不支持回退
  • characters() 可能被多次调用(如含 CDATA 或换行),需用 StringBuilder 累积文本
  • JDK 9+ 默认禁用不安全的 DTD 功能,但显式关闭仍是最佳实践
  • 若遇到 UnsupportedOperationException,检查是否误对工厂调用了 setFeature 而非 setXxx 方法

相关案例查看更多