Java如何处理XML中的 等HTML实体

16次阅读

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

Java如何处理XML中的 等HTML实体

java处理XML中像zuojiankuohaophpcn&"这类html实体(实际是XML预定义实体)时,核心原则是:**xml解析器默认会自动解析这些标准实体,无需手动干预;但若它们以原始字符串形式出现在文本内容中(如未被正确转义或来自非标准来源),则需额外解码。**

XML解析器自动处理标准实体

Java内置的XML解析器(如dom、SAX、StAX)在读取XML文档时,会自动将zuojiankuohaophpcnyoujiankuohaophpcn&'"还原为对应字符(>&'")。你从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内容
text=ZqhQzanResources