DOM Parser解析XML出现&相关实体引用错误该如何解决
解决方案
标准DOM Parser严格遵循W3C XML规范,默认不支持关闭实体合法性校验,未转义的&本身不属于格式良好的XML内容,因此无法通过标准DOM Parser的原生配置直接跳过该校验,可采用以下三种方案解决:
方案1:内存中预处理XML内容(最通用)
不需要修改原XML文件,只需将文件内容读取到内存后,通过正则匹配替换单独出现的未转义&即可,注意要避开已经正确转义的实体,避免重复转义:
示例正则规则:&(?!(amp|lt|gt|quot|apos);)
该正则会匹配所有后面没有跟随合法XML实体名的&,将匹配到的内容替换为&后再传给DOM Parser解析即可。
该方案适配所有语言和DOM Parser实现,对业务逻辑侵入性最低。
方案2:使用容错型XML解析库
多数编程语言都有支持格式容错的XML解析实现,会自动修复未转义&、未闭合标签等常见的XML格式错误,无需自行处理字符替换:
- Java生态可选用Jsoup的XML解析模式、Apache NekoHTML解析器,开启容错配置即可
- Python生态可使用lxml库,初始化XMLParser时传入
recover=True参数即可自动修复格式错误 - 其他语言均有对应的同类容错解析工具可直接使用
方案3:流层面字符过滤(适合超大XML文件)
如果需要处理的XML文件体积过大,全量读取到内存做替换会占用过多资源,可以在文件读取流和DOM Parser之间加一层自定义字符过滤流,在流式读取的过程中动态替换未转义的&,无需加载全量文件到内存。
不建议通过反射修改标准DOM Parser的校验逻辑、或修改底层XML规范实现,这类改法兼容性极差,后续遇到合法实体引用、自定义实体场景时极易出现解析异常。
内容的提问来源于stack exchange,提问作者Madhusudhan
相关产品推荐
相关产品推荐

