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