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的可以采取任何类型的数据。由于情况并非如此,我必须逃避哪些角色?谢谢。
答
不,XML本身不能表示除tab,回车和换行之外的任何早于U + 0020的字符。
字符范围
字符:: =#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)){...}
家伙 - 感谢您的信息。这很有帮助。 – James 2011-02-04 14:26:25