XML的BOM
最近做一個(gè)XML的生成與導(dǎo)入功能,生成的XML經(jīng)過(guò)語(yǔ)法驗(yàn)證和Schema驗(yàn)證,均無(wú)錯(cuò)誤,編碼方式也是所要求UTF-8,可是導(dǎo)入時(shí)卻一直提示:
Error on line 1 of document? : Content is not allowed in prolog. Nested exception: Content is not allowed in prolog.
由于導(dǎo)入的系統(tǒng)時(shí)稅務(wù)部門(mén)的網(wǎng)站,無(wú)從查看代碼,跟蹤異常,所有的信息只這一句莫名其妙的錯(cuò)誤提示。
搜索后得知,可能是因?yàn)锽OM引起的。
什么是BOM呢?
BOM:Byte Order Mark,中文名字節(jié)順序標(biāo)記。UCS規(guī)范建議在傳輸字節(jié)流前,先傳輸BOM來(lái)判斷字節(jié)順序。其實(shí)UTF-8是不需要用BOM來(lái)表明字節(jié)順序的,但是可以用BOM來(lái)表明編碼方式。BOM的UTF-8編碼是EF BB BF,所以呢,如果接受者收到EF BB BF開(kāi)頭的字節(jié)流,就說(shuō)明它是UTF-8編碼了。
由此可見(jiàn),對(duì)于UTF-8來(lái)說(shuō),BOM是可有可無(wú)的,可是,有的XML解析方式不認(rèn)這個(gè)BOM,所以就報(bào)錯(cuò)了。
怎么判斷XML是否含有BOM呢?
用UltraEdit或者其他可以帶有十六進(jìn)制編輯功能的軟件打開(kāi)XML,如果開(kāi)頭有EF BB BF就說(shuō)明含有BOM了。
怎樣去掉BOM呢?
可以用UltraEdit或者EmEditor打開(kāi)XML,然后另存為,保存的時(shí)候有選項(xiàng)是以無(wú)BOM的UTF-8保存還是以有BOM的UTF-8保存。
怎樣生成無(wú)BOM的XML呢?
要去掉生成的XML的BOM,要從源頭上解決,不可能讓用戶(hù)每次生成XML后,手動(dòng)編輯去掉BOM后再導(dǎo)入。
之前生成XML的代碼是:
XmlWriterSettings?settings?=?new?XmlWriterSettings();settings.Encoding?=?System.Text.Encoding.GetEncoding("utf-8");
XmlWriter?writer?=?XmlWriter.Create(pathName,?settings);
修改之后:
XmlWriterSettings?settings?=?new?XmlWriterSettings();settings.Encoding?=?new?UTF8Encoding(false);
XmlWriter?writer?=?XmlWriter.Create(pathName,?settings);
這樣用XmlWriter生成的XML就是不帶BOM的了,導(dǎo)入成功,不再報(bào)錯(cuò)。
?
轉(zhuǎn)載于:https://www.cnblogs.com/niuniu1985/archive/2011/07/14/2106439.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: cad lisp 二次抛物线_学习CAD
- 下一篇: 1.5.2 在IIS上配置ASP.NET