XmlWriter.WriteCData抛出ArgumentException - 无效字符

时间:2011-02-03 23:31:56

标签: c# .net xml

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,是无效字符”

我认为CData可以采用任何类型的数据。既然情况并非如此,我必须逃脱哪些角色?感谢。

3 个答案:

答案 0 :(得分:9)

不,除了制表符,回车符和换行符之外,XML本身不能代表U + 0020之前的任何字符。

来自the specsection 2.2

  

角色范围

     

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

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

答案 1 :(得分:2)

我建议您查看http://www.w3.org/TR/REC-xml/#dt-cdsection以了解允许的特定字符。这将显示XML中允许的内容(并且将向您显示不允许0x0B)。您是否要求按原样维护此内容?如果没有,我会建议您Base64 encoding,以便您可以安全。

答案 2 :(得分:1)

可能只有在您无法控制需要此类恶作剧的消费者时才需要,但在这样的捏合中,您可以禁用XmlWriter的字符检查机制:

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