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