讲师中心 微信公众号
AI工具推荐 视频效率加速

Java SAX解析器DefaultHandler 重写startElement方法解析XML

千涛同学_1100

千涛同学_1100

发布时间:2026-02-15 10:05:35

|

883人浏览过

|

来源于php中文网

原创

SAX解析中,标签名用localName获取(qName在命名空间下不可靠),属性通过attributes遍历;characters可能分多次调用,需StringBuilder缓存;嵌套结构靠栈维护路径;DefaultHandler回调单线程串行,字段无需volatile。

java sax解析器defaulthandler 重写startelement方法解析xml

startElement 里怎么拿到标签名和属性

关键就两步:用 localName 或 qName 拿标签名,用 attributes 对象遍历属性。SAX 不建树,所有信息都靠这个回调参数传进来。

常见错误是直接打印 qName 却没处理命名空间——如果 XML 带 xmlns,qName 可能为空或带前缀,此时得优先用 localName;而 attributes.getValue("attr") 在属性不存在时返回 null,不抛异常,但容易漏判空指针。

  • attributes.getLength() 返回属性个数,从 0 开始索引
  • 用 attributes.getQName(i) 拿属性名,attributes.getValue(i) 拿值,比按名字查更安全(避免拼写错)
  • 如果 XML 有默认命名空间(如 xmlns="http://example.com"),localName 有效,qName 往往为空字符串

DefaultHandler 的 characters 方法为什么经常读不到完整文本

SAX 不保证一次 characters 调用就把一个文本节点全塞给你——它可能被拆成多次调用,尤其含换行、空格或 CDATA 时。你重写的 startElement 里没法直接拿到文本,得靠 characters + 状态标记配合。

典型翻车场景:在 startElement 里设了个 currentTag = "name",然后指望下一次 characters 就是这个标签的值——结果中间插了注释、换行,或者 JVM 分片推送,characters 被调了三次,第二次还全是空白符。

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

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载
  • 必须用 StringBuilder 缓存每次 characters 的 ch 数组片段(注意 start 和 length 参数!别直接 new String(ch)
  • 在 endElement 里清空/提交缓存,而不是在 characters 里立刻处理
  • 遇到 ignorableWhitespace 回调(如果设置了 setFeature("http://xml.org/sax/features/ignore-external-dtd", true) 等),空白可能被过滤,但默认不开启,别假设它会帮你 trim

解析嵌套结构时怎么区分同名子标签

没有 DOM 那种父节点引用,只能靠自己维护解析路径栈。比如 <book><author><name>...</name></author></book> 和 <book><title><name>...</name></title></book> 里的两个 name,光看 localName 是一样的,得结合上下文。

最容易被忽略的是:不能只记上一层标签名,得记完整路径或深度状态。有人用布尔变量 inAuthorName,但嵌套三层就崩了;也有人用计数器,但兄弟节点并列时逻辑难维护。

  • 推荐在 startElement 入栈 localName,endElement 出栈,用 Deque<string></string> 存路径
  • 判断当前是否为 “author/name” 时,检查栈长度 ≥2 且末尾两个元素是 "author" 和 "name"
  • 别在 characters 里查栈——万一文本跨多层(比如 <a><b>text</b></a>),栈顶已变,得在 startElement 记下“当前正在进入哪个有意义的叶子节点”

DefaultHandler 子类里字段要不要加 volatile 或同步

不用。SAX 解析器是单线程顺序回调,startElement → 若干 characters → endElement 严格串行,所有回调都在同一个线程里跑。你在 startElement 改的字段,到下一次 characters 一定能读到最新值。

但很多人误以为要线程安全,加了 volatile 或锁,纯属冗余——反而干扰 JIT 优化,还让代码显得可疑。真正该小心的是:别在回调里起新线程去处理数据,那才真需要同步。

  • 所有解析状态字段(如 currentText、inTargetTag)声明为普通实例变量即可
  • 如果解析完要导出结果,确保在 endDocument 之后再访问这些字段,别在回调中途就拿去异步提交
  • 多个 SAXParser 实例共用一个 DefaultHandler 子类实例?不行——每个解析任务必须用独立 handler 实例,否则状态串了
事情说清了就结束

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6819

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

4784

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

6217

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2522

2024.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1818

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2884

2023.09.04

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn