XmlWriter.WriteCData引发ArgumentException - 无效字符

问题描述:

StringBuilder output = new StringBuilder(); 
using (XmlWriter writer = XmlWriter.Create(output)) 
{ 
    writer.WriteStartElement("test"); 
    writer.WriteCData("taco\vbell"); 
    writer.WriteEndElement(); 
    writer.WriteEndDocument(); 
} 

Console.WriteLine(output.ToString()); 

WriteCData引发以下的ArgumentException, “ '\ V',十六进制值0x0B中,是无效字符”XmlWriter.WriteCData引发ArgumentException - 无效字符

我想CData的可以采取任何类型的数据。由于情况并非如此,我必须逃避哪些角色?谢谢。

+0

家伙 ​​- 感谢您的信息。这很有帮助。 – James 2011-02-04 14:26:25

不,XML本身不能表示除tab,回车和换行之外的任何早于U + 0020的字符。

the specsection 2.2

字符范围

字符:: =#X9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]/*任何Unicode字符,不包括代理块,FFFE和FFFF。 */

不幸的是,没有标准的方式来表示“禁止”字符。你必须创建你自己的转义机制。

我建议检查http://www.w3.org/TR/REC-xml/#dt-cdsection允许的特定字符。这将告诉你在XML中允许什么(并且会告诉你不允许0x0B)。你是否需要保留这些内容?如果没有,我会推荐Base64 encoding,以便您可以安全。

,如果你有过被要求这样有心计消费者无法控制的大概只有必需的,但在这样的紧要关头,您可以禁用的XmlWriter的字符检查机制:

XmlWriterSettings s = new XmlWriterSettings(); 
s.CheckCharacters = false; 
using (XmlWriter writer = XmlWriter.Create(output, s)){...}