XmlReader 读取带有特殊符号Unicode 时的异常

    xml可以利用&#nnn;的格式显示特定的字符,nnn代表该字符的十进制Unicode代码,或者采用十六进制代码,在编码之前加上x字符即可(&#xnnn;)


    在ASCII中 十进制大于等于32(16进制大于等于20)的"可显示字符",在XmlReader中读取(Read或者ReadToFollowing)是没有问题的,
那么对于 十进制小于32(16进制小于20)的"控制字符",在XmlReader中读取过程中Read()时会忽略控制字符后面的内容,ReadToFollowing则会报异常。(这里十进制小于32的"控制字符"并不都会引起问题,那几个不会有问题大家可以自己试下)

要解决这个问题可以设置 XmlReaderSettings.CheckCharacters 属性(此属性在 .NET Framework 2.0 版中是新增的)
属性值:如果进行字符检查,则为 true;否则为 false。默认为 true。

下面是个简单的例子:
test.xml 文件内容

<Root>
<Content>&#xb;</Content>
<Content>Ohter string here.</Content>
</Root>

C#测试代码:

string filePath = @"You file dir\test.xml";
XmlReaderSettings xrs = new XmlReaderSettings();
xrs.CheckCharacters = false;
using (XmlReader reader = XmlReader.Create(filePath, xrs))
{
while (reader.ReadToFollowing("Content"))
{}
}

如果用XmlDocument读取这样的xml就没有问题,建议使用XmlReader的朋友留意下这个。

下面贴出ASCII的所有"控制字符"(来自维基百科)

二进制十进制十六进制缩写可以显示的表示法名称/意义
0000 0000 0 00 NUL 空字符(Null)
0000 0001 1 01 SOH 标题开始
0000 0010 2 02 STX 本文开始
0000 0011 3 03 ETX 本文结束
0000 0100 4 04 EOT 传输结束
0000 0101 5 05 ENQ 请求
0000 0110 6 06 ACK 确认回应
0000 0111 7 07 BEL 响铃
0000 1000 8 08 BS 退格
0000 1001 9 09 HT 水平定位符号
0000 1010 10 0A LF 换行键
0000 1011 11 0B VT 垂直定位符号
0000 1100 12 0C FF 换页键
0000 1101 13 0D CR Enter键
0000 1110 14 0E SO 取消变换(Shift out)
0000 1111 15 0F SI 启用变换(Shift in)
0001 0000 16 10 DLE 跳出数据通讯
0001 0001 17 11 DC1 设备控制一(XON 激活软件速度控制)
0001 0010 18 12 DC2 设备控制二
0001 0011 19 13 DC3 设备控制三(XOFF 停用软件速度控制)
0001 0100 20 14 DC4 设备控制四
0001 0101 21 15 NAK 确认失败回应
0001 0110 22 16 SYN 同步用暂停
0001 0111 23 17 ETB 区块传输结束
0001 1000 24 18 CAN 取消
0001 1001 25 19 EM 连接介质中断
0001 1010 26 1A SUB 替换
0001 1011 27 1B ESC 退出键
0001 1100 28 1C FS 文件分区符
0001 1101 29 1D GS 组群分隔符
0001 1110 30 1E RS 记录分隔符
0001 1111 31 1F US 单元分隔符
0111 1111 127 7F DEL 删除

 

 

posted on 2011-12-08 16:28  debugdotnet  阅读(844)  评论(0编辑  收藏  举报

导航