Rai*_*Son 210 xml illegal-characters
我目前正在处理一些XML.
我有节点,如下所示:
<node>This is a string</node>
Run Code Online (Sandbox Code Playgroud)
我传递给节点的一些字符串将包含&,#,$等字符.
<node>This is a string & so is this</node>
Run Code Online (Sandbox Code Playgroud)
这是因为&
我无法将这些字符串包装在CDATA中,因为它们需要保持原样.我试过在线查找一些字符列表,这些字符无法放入XML节点而不是CDATA.
任何人都可以指向一个方向或向我提供非法字符列表吗?
pot*_*ame 198
好的,让我们将(1)任何XML文档中完全无效的字符和(2)需要转义的字符分开:
@dolmen提供的答案XML中的无效字符仍然有效,但需要使用XML 1.1规范进行更新.
此处描述的字符是允许插入XML文档的所有字符.
允许字符的全局列表是:
[2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
基本上,不允许使用Unicode范围之外的控制字符和字符.这也意味着禁止调用例如字符实体.
允许字符的全局列表是:
[2] Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
[2a] RestrictedChar ::= [#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]
这个XML建议的修订扩展了允许的字符,因此允许控制字符,并考虑到Unicode标准的新版本,但仍然不允许这些:NUL(x00),xFFFE,xFFFF ......
但是,不鼓励使用控制字符和未定义的Unicode char.
还可以注意到,所有解析器并不总是考虑到这一点,并且可能拒绝具有控制字符的XML文档.
在<必须使用转义<实体,因为它被认为是一个标签的开始.
在&必须使用转义&实体,因为它被认为是开始一个实体引用
该>应进行转义>实体.它不是强制性的 - 它取决于上下文 - 但强烈建议逃避它.
本'应该用转义'实体-在单引号内定义的属性强制性的,但它强烈建议总是逃避它.
本"应该用转义"实体-在双引号内定义的属性强制性的,但它强烈建议总是逃避它.
dol*_*men 171
有效字符列表在XML规范中:
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
Run Code Online (Sandbox Code Playgroud)
Wel*_*bog 135
唯一的非法字符&,<并且>(和"或'在属性).
他们使用逃脱XML实体,在你想这种情况下&的&.
但实际上,你应该使用一个为你编写XML的工具或库,并为你抽象出这种东西,这样你就不用担心了.
mat*_*eca 58
这是一个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, "");
}
Run Code Online (Sandbox Code Playgroud)
cgp*_*cgp 17
预先声明的字符是:
& < > " '
Run Code Online (Sandbox Code Playgroud)
http://xml.silmaril.ie/specials.html
小智 7
另一种在C#中逃避可能不需要的XML/XHTML字符的简单方法是:
WebUtility.HtmlEncode(stringWithStrangeChars)
Run Code Online (Sandbox Code Playgroud)
在 C# 中删除不正确 XML 字符的另一种方法是使用XmlConvert.IsXmlChar(自 .NET Framework 4.0 起可用)
public static string RemoveInvalidXmlChars(string content)
{
return new string(content.Where(ch => System.Xml.XmlConvert.IsXmlChar(ch)).ToArray());
}
Run Code Online (Sandbox Code Playgroud)
或者您可以检查所有字符是否都是 XML 有效的:
public static bool CheckValidXmlChars(string content)
{
return content.All(ch => System.Xml.XmlConvert.IsXmlChar(ch));
}
Run Code Online (Sandbox Code Playgroud)
例如,垂直制表符 ( \v) 对 XML 无效,它是有效的 UTF-8,但不是有效的 XML 1.0,甚至许多库(包括 libxml2)都错过了它并静默输出无效的 XML。
除了potame的答案之外,如果您确实想使用CDATA块进行转义。
如果将文本放在CDATA块中,则无需使用转义。在这种情况下,您可以使用以下范围内的所有字符:
注意:最重要的是,不允许使用]]>字符序列。因为它将与CDATA块的末尾匹配。
如果仍然有无效字符(例如控制字符),那么最好使用某种编码(例如base64)。