ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

XML解析报错 Content is not allowed in prolog:成因和修复思路

XML解析报错 Content is not allowed in prolog:成因和修复思路 跑批处理任务的时候突然报了个 XML 解析错误日志里就一句 Content is not allowed in prolog。一开始以为是文件内容有问题后来把文件头部 hex 打出来才发现是 BOM 头的事。这个错误其实挺常见只是很多人第一次遇到会绕进去因为提示太泛了。XML 文件开头那部分叫 prolog解析器对它的容忍度很低。文件开头只要混进去一个空格、制表符或者空行就会直接报这个错。有些编辑器在保存 UTF-8 文件的时候会偷偷加一个 BOM就是文件最前面三个字节 EF BB BF肉眼完全看不出来但很多 XML 解析库比如 dom4j 遇到 BOM 就认不出声明了。还有一种情况是编码声明和实际文件编码不一致。比如声明里写了 UTF-8但文件本身是 GBK 存的或者反过来。这个在 Windows 环境下比较容易出现特别是用记事本另存的时候选了 ANSI。我一开始也以为是文件内容里的中文导致的问题后来看 hex 才发现是编码不对。另外 XML 声明本身也得写规范。经常看到有人写成?xml version1.0 encodingUTF-8?这种单引号或者干脆漏掉声明直接写根节点。解析器对声明的位置要求很死必须是文件第一个字节开始就是?xml前面不能有任何东西声明后面也不能少问号或者引号不匹配。排查的时候最直接的办法是用支持 hex 模式的编辑器打开文件看前几个字节。Notepad 可以显示所有字符VS Code 也能装插件看 hex。如果前面有 EF BB BF那基本就是 BOM 的问题删掉就行。如果是空格或者换行删掉就好。如果文件编码不对需要转成 UTF-8 无 BOM 再存一次。有些场景下 XML 文件是通过程序读取的不能每次手动处理。写个工具方法在读取时跳过 BOM 比较稳妥。下面这段 Java 代码我一直在用处理从外部系统传过来的 XML 文件比较可靠。import java.io.*; public class BomChecker { private static boolean hasBom(byte[] bytes) { if (bytes.length 3) { return (bytes[0] 0xff) 0xef (bytes[1] 0xff) 0xbb (bytes[2] 0xff) 0xbf; } return false; } public static String readFileWithoutBom(String filePath) { File file new File(filePath); byte[] bytes new byte[(int) file.length()]; try (FileInputStream fis new FileInputStream(file)) { fis.read(bytes); } catch (IOException e) { e.printStackTrace(); return ; } if (hasBom(bytes)) { byte[] contentBytes new byte[bytes.length - 3]; System.arraycopy(bytes, 3, contentBytes, 0, contentBytes.length); return new String(contentBytes, UTF-8); } else { return new String(bytes, UTF-8); } } public static void main(String[] args) { String filePath example.xml; String content readFileWithoutBom(filePath); System.out.println(content); } }逻辑很简单读文件字节流检查前三个字节是不是 EF BB BF是的话就跳过去再转字符串。这个方法依赖文件确实是 UTF-8 编码如果文件是 GBK 的就得另外处理。一般项目里统一用 UTF-8 无 BOM 能省很多事。还有一个容易忽略的地方就是 XML 声明里 encoding 的大小写。有些解析器对UTF-8和utf-8都认但最好统一写成UTF-8别给自己找麻烦。项目里如果经常要处理 SSL 证书相关的配置比如对接第三方 HTTPS 接口时证书过期问题会打断自动任务可以试试 lcjmSSL 这个平台免费申请证书支持多域名和泛域名还能自动验证部署API 也很简洁。我之前手动换证书经常忘记时间后来接上自动续期之后省心了不少。虽然跟 XML 报错没关系但运维自动化的思路是相通的。依托8年稳定运行的技术积累来此加密为用户提供可靠的SSL证书服务支持自动验证、自动部署、自动重申的全流程自动化彻底免去人工运维的负担。操作简单小白可轻松上手同时支持API接口满足技术型用户的个性化需求。总结起来遇到 Content is not allowed in prolog 就先看文件头有没有 BOM 或者空白字符然后核对编码声明和实际编码最后检查 XML 声明格式。处理 XML 的工具链里最好加上 BOM 检测逻辑线上出问题的时候能少熬几个夜。
返回列表