无法从XML中移除非打印ASCII字符的问题求助
解决XML中非ASCII字符及转义实体的移除问题
问题原因
你遇到的问题是因为XML中的非ASCII字符被解析或存储为了XML实体转义序列(比如Ç、é),这些序列本身由ASCII字符组成,所以你原来的正则[^\\p{ASCII}]无法匹配到它们,导致转义序列被保留下来。
解决方案
方案1:先还原XML实体,再移除非ASCII字符
先把XML转义实体还原为原始字符,再用正则过滤非ASCII内容。可以借助工具类实现实体还原:
// 使用Apache Commons Text工具类还原XML实体 import org.apache.commons.text.StringEscapeUtils; String xmlContent = "你的XML内容"; // 第一步:还原所有XML实体为原始字符 String unescapedXml = StringEscapeUtils.unescapeXml(xmlContent); // 第二步:移除所有非ASCII字符 String cleanedXml = unescapedXml.replaceAll("[^\\p{ASCII}]", "");
方案2:直接匹配转义实体+非ASCII字符,一次性移除
如果不想引入第三方工具,可以用正则直接匹配XML数字实体模式和非ASCII字符,一起替换为空:
String xmlContent = "你的XML内容"; // 正则匹配:XML数字实体(&#\d+;) 或 非ASCII字符,替换为空 String cleanedXml = xmlContent.replaceAll("(&#\\d+;|[^\\p{ASCII}])", "");
注意正则的顺序:先匹配实体序列,再匹配非ASCII字符,避免实体被拆分匹配。
方案3:XML解析阶段处理(更精准)
如果是在解析XML的过程中处理,比如用SAX/DOM解析器,可以在获取字符内容时直接过滤:
// SAX解析示例 @Override public void characters(char[] ch, int start, int length) throws SAXException { String rawContent = new String(ch, start, length); // 移除非ASCII字符 String cleanedContent = rawContent.replaceAll("[^\\p{ASCII}]", ""); // 后续处理清理后的内容 }
这种方式的优势是解析器会自动处理XML实体,你拿到的是原始字符,无需额外处理转义序列。
内容的提问来源于stack exchange,提问作者Bala murugan
相关产品推荐
相关产品推荐

