我正在使用一些包含字符串的XML:

<node>This is a string</node>

我传递给节点的一些字符串将有&,#,$等字符:

<node>This is a string & so is this</node>

由于&,这是无效的。

我不能在CDATA中包装这些字符串,因为它们需要这样。我尝试寻找一个字符列表,这些字符不能放在XML节点中,而不能放在CDATA中。

有人能给我指个方向或者给我一份非法字符的列表吗?


当前回答

综上所述,文本中的有效字符为:

制表符,换行和换行。 除&和<外,所有非控制字符都有效。 如果使用]],则>无效。

XML规范的2.2节和2.4节详细给出了答案:

字符

合法字符包括制表符、回车符、换行符以及Unicode和ISO/IEC 10646的合法字符

字符数据

The ampersand character (&) and the left angle bracket (<) must not appear in their literal form, except when used as markup delimiters, or within a comment, a processing instruction, or a CDATA section. If they are needed elsewhere, they must be escaped using either numeric character references or the strings " & " and " < " respectively. The right angle bracket (>) may be represented using the string " > ", and must, for compatibility, be escaped using either " > " or a character reference when it appears in the string " ]]> " in content, when that string is not marking the end of a CDATA section.

其他回答

“XmlWriter和低ASCII字符”对我很有用

string code = Regex.Replace(item.Code, @"[\u0000-\u0008,\u000B,\u000C,\u000E-\u001F]", "");

另一个简单的方法是在c#中转义可能不需要的XML / XHTML字符:

WebUtility.HtmlEncode(stringWithStrangeChars)

这是一个c#代码,用于从字符串中删除XML无效字符并返回一个新的有效字符串。

public static string CleanInvalidXmlChars(string text) 
{ 
    // From xml spec valid chars: 
    // #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]     
    // any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. 
    string re = @"[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD\u10000-\u10FFFF]"; 
    return Regex.Replace(text, re, ""); 
}

有人尝试过这个system . security . securityelelement . escape (yourstring)吗? 这将用有效的等效字符替换字符串中的无效XML字符。

除了potame的答案,如果你想转义使用CDATA块。

如果你把你的文本放在一个CDATA块,那么你不需要使用转义。 在这种情况下,您可以使用以下范围内的所有字符:

注意:除此之外,您不允许使用]]>字符序列。因为它将匹配CDATA块的末尾。

如果仍然存在无效字符(例如控制字符),那么可能最好使用某种编码(例如base64)。