XML的BOM

最近做一个XML的生成与导入功能,生成的XML经过语法验证和Schema验证,均无错误,编码方式也是所要求UTF-8,可是导入时却一直提示:

Error on line 1 of document  : Content is not allowed in prolog. Nested exception: Content is not allowed in prolog.
由于导入的系统时税务部门的网站,无从查看代码,跟踪异常,所有的信息只这一句莫名其妙的错误提示。

搜索后得知,可能是因为BOM引起的。

什么是BOM呢?

BOM:Byte Order Mark,中文名字节顺序标记。UCS规范建议在传输字节流前,先传输BOM来判断字节顺序。其实UTF-8是不需要用BOM来表明字节顺序的,但是可以用BOM来表明编码方式。BOM的UTF-8编码是EF BB BF,所以呢,如果接受者收到EF BB BF开头的字节流,就说明它是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的了,导入成功,不再报错。

 

转载于:https://www.cnblogs.com/niuniu1985/archive/2011/07/14/2106439.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值