转载自:http://askcuix.appspot.com/2011/02/17/content-is-not-allowed-in-prolog.html
最近在做一些批处理XML的项目,通过Spring Batch读取XML,然后将数据存入数据库。XML是客户方通过AS400的技术将数据读出并写入到文件的,我不了解AS400处理这类问题是不是很麻烦,每次XML需要做些变动的时候,客户总是表现的很为难,并且都是很久才能给到新的XML,还总是有这样那样的问题,甚至都不是一个有效的XML。这两天总算是改的差不多了,但遇到了好几次这样的exception: org.xml.sax.SAXParseException: Content is not allowed in prolog。以前也接触过不少XML,可是这种问题还真是没遇到过。
检查XML发现有一些转义字符没有做处理,&没有写成&,这是出现这种错误的一种可能性,在XML规范中,明确的说明&和<需要做转义,不能直接出现在XML文档中,否则就不是一个有效的XML。修正了这个问题,一个XML处理成功了。
在执行另外一个XML文件时,又遇到了这个问题,将转义字符的问题修正后,依然存在该错误,经过google的帮助,发现应该是文件编码的问题。检查该文件,是UTF-8编码,应该没问题的,结果问题就出在这个文件用UltraEdit编辑过,UltraEdit等一些编辑器会在无BOM头的UTF-8文件中加入BOM信息,但是XML解析器不认BOM。查看该文件的二进制内容,会发现在文件头有EF BB BF,在对应的字符串显示中可以看到它是在<?xml version="1.0" encoding="UTF-8"?>前的一个乱码字符,问题就出在了这个字符上。我平时是用NotePad++,在状态栏的文件编码中可以看到这个文件是UTF-8编码,我在encoding菜单中选择UTF-8 without BOM,这时文件编码就变成了ANSI-UTF8,同时EF BB BF也消失了,再执行这个文件就正确了。这个encoding选项在高版本的UltraEdit中也有,但是旧版本中是没有的。
BOM - byte order mark,就是字节序标记,UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式, 如果接受者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了,Windows就是使用BOM来标记文本文件的编码方式的。对于BOM我没有深究,有兴趣的话可以参考:http://www.unicode.org/faq/utf_bom.html#bom1。
对于这个错误,还有一种可能性,就是有标签使用了中文输入法,比如<?xml version="1.0" encoding="UTF-8"?>写成了<?xml version="1.0" encoding="UTF-8"?>,注意这两个问号都用了中文输入法。
这是我已发现的出现这种错误的三个可能性,出现这种错误后,应检查文件编码,除此以外应该就是一些字符输入错误的问题了,有问题的朋友可以从这两个方面着手。据说新版本的JDom解决了这个问题,看来并不是所有的解析器都不认BOM,有时间的话还是要研究研究。