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></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) 编辑 收藏 举报