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  阅读(896)  评论(0)    收藏  举报

导航