XML 解析器默认自动解析标准实体如 zuojiankuohaophpcn、&、”,无需手动干预;若实体以原始字符串形式出现,则需额外解码。

Java 处理 XML 中像 zuojiankuohaophpcn、&、" 这类 HTML 实体(实际是 XML 预定义实体)时,核心原则是:**XML 解析器默认会自动解析这些标准实体,无需手动干预;但若它们以原始字符串形式出现在文本内容中(如未被正确转义或来自非标准来源),则需额外解码。**
XML 解析器自动处理标准实体
Java 内置的 XML 解析器(如 DOM、SAX、StAX)在读取 XML 文档时,会自动将 zuojiankuohaophpcn、youjiankuohaophpcn、&、'、" 还原为对应字符(、>、&、'、")。你从 Node.getTextContent() 或Characters事件中拿到的已经是解码后的结果。
- 确保 XML 文档本身格式正确,例如:
→ 解析后得到文本5 zuojiankuohaophpcn 10&true "5 - 不要在解析前用正则或字符串替换去“提前解码”,这可能导致重复解码或破坏结构
手动解码非标准或残留实体字符串
如果字符串中存在未被 XML 解析器处理的实体(比如从 HTML 片段混入、JSON 字段里嵌了 XML 实体、或解析失败后拿到的原始 CDATA/ 文本),可借助 工具 类解码:
- 使用
org.apache.commons.text.StringEscapeUtils.unescapeXml()(推荐,轻量且专注 XML) - 避免用
StringEscapeUtils.unescapeHtml4(),它会处理 HTML 特有实体(如),可能引入意外行为 - 示例:
StringEscapeUtils.unescapeXml("Hello & World")→"Hello & World"
生成 XML 时正确 编码 特殊字符
写入 XML 时,不要手动拼接 zuojiankuohaophpcn 等字符串。应让 XML 序列化器自动处理:
立即学习“Java 免费学习笔记(深入)”;
- 用
Transformer输出 DOM 树,或XMLOutputFactory写 StAX 事件,特殊字符会自动转义 - 若必须手动生成(不推荐),只对
、>、&、"、'做转义,且严格使用 XML 标准形式(如zuojiankuohaophpcn,不是zuojiankuohaophpcn) - 禁止直接用
String.replace()批量替换,易出错且忽略上下文(如属性值和文本节点规则不同)
注意 HTML 实体与 XML 实体的 区别
XML 只定义了 5 个预设实体,其余(如 、©)属于 HTML 规范,在纯 XML 中非法。若 XML 中出现这类实体:
- 解析会失败(除非 DTD 声明了该实体),抛出
SAXParseException - 解决方案:预处理字符串,用
StringEscapeUtils.unescapeHtml4()先转成 Unicode,再交给 XML 解析器;或改用支持 HTML 实体的库(如 Jsoup)先清洗 - 根本建议:统一数据源,避免 HTML 片段直接混入 XML 内容