使用C#.NET处理XML中的禁用字符

我有一个对象,我正在序列化为xml。 似乎其中一个属性中的值包含hex字符0x1E。 我已经尝试将XmlWriterSettings的Encoding属性设置为“utf-16”和“unicode”,但我仍然会抛出exception:

这是生成XML文档的错误。 —> System.InvalidOperationException:生成XML文档时出错。 —> System.ArgumentException:”,hex值0x1E,是无效字符。

有没有办法让这些字符进入xml? 如果没有,是否还有其他字符会导致问题?

你可以像对待HTML那样逃避。 0x1E与十进制30相同,所以只需用字符串“&30;”替换记录分隔符。 它应该没问题。

XML建议书(又名规范) http://www.w3.org/TR/2000/REC-xml-20001006概述了不允许使用哪些字符,必须进行转义


2.2字符

[定义:解析后的实体包含文本,一系列字符,可以表示标记或字符数据。] [定义:字符是ISO / IEC 10646 [ISO / IEC 10646]规定的文本primefaces单位(另见[ISO / IEC 10646-2000])。 合法字符是制表符,回车符,换行符以及Unicode和ISO / IEC 10646的合法字符.A.1规范性引用文件中引用的这些标准的版本在编写本文档时是最新的。 可以通过修订或新版本将新字符添加到这些标准中。 因此,XML处理器必须接受为Char指定的范围内的任何字符。 不鼓励使用[Unicode]第6.8节中定义的“兼容性字符”(另见[Unicode3]第3.6节中的D21)。

角色范围

 [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */ 

用于将字符代码点编码成位模式的机制可以根据实体而不同。 所有XML处理器必须接受10646的UTF-8和UTF-16编码; 用于发信号通知两者中的哪一个正在使用或用于使其他编码发挥作用的机制将在后面的4.3.3实体中的字符编码中讨论。


我知道这是一个老问题,但是我发现了一个链接,我在这里发布了它,对于遇到这个问题的人来说会很有用。 它对我有用。

http://seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/

和来自该网站的代码。(如果网站出现故障)

 ///  /// Remove illegal XML characters from a string. ///  public string SanitizeXmlString(string xml) { if (xml == null) { throw new ArgumentNullException("xml"); } StringBuilder buffer = new StringBuilder(xml.Length); foreach (char c in xml) { if (IsLegalXmlChar(c)) { buffer.Append(c); } } return buffer.ToString(); } ///  /// Whether a given character is allowed by XML 1.0. ///  public bool IsLegalXmlChar(int character) { return ( character == 0x9 /* == '\t' == 9 */ || character == 0xA /* == '\n' == 10 */ || character == 0xD /* == '\r' == 13 */ || (character >= 0x20 && character <= 0xD7FF ) || (character >= 0xE000 && character <= 0xFFFD ) || (character >= 0x10000 && character <= 0x10FFFF) ); } 

XML是一种人类可读的格式,禁止使用不可打印的控制字符。 你可以使用十进制字符实体代码,如&#30; 表示它们,或base-64编码内容。

由于你没有提供任何细节,我猜你的属性是System.String类型。 如果是这样,那么你不能按原样序列化它。 相反,您必须将其序列化为byte []:

 [XmlRoot("root")] public class HasBase64Content { [XmlIgnore] public string Content { get; set; } [XmlElement("Content")] public byte[] Base64Content { get { return System.Text.Encoding.UTF8.GetBytes(Content); } set { if (value == null) { Content = null; return; } Content = System.Text.Encoding.UTF8.GetString(value); } } } 

如果您的数据不允许Unicode 控制图片块中的字符,您可以通过在序列化时将它们替换为控制字符来保持人类可读性,并在反序列化时再次返回。

以下是人物:

␀␁␂␃␅␆␇␈␉␊␋␍␍␎␎

␐␑␒␓␕␖␗␘␙␚␛␝␝␞␞

␠␡

希望它们在您的浏览器和编辑器中呈现。 即使他们不这样做,他们在XML中也是合法的。