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可以采用任何类型的数据。既然情况并非如此,我必须逃脱哪些角色?感谢。
答案 0 :(得分:9)
不,除了制表符,回车符和换行符之外,XML本身不能代表U + 0020之前的任何字符。
角色范围
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)){...}