说明:
XML 1.0 的合法字符如下:
Char::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, And FFFF. */
例如,.NET 框架中的 SQLDataAdapter.Fill() 将自动将 XML 1.0 不支持的 Unicode 字符转换为 HTML 字符(如 #xB 等),因此,在这类场景中,应当首先过滤非法字符,否则 XSL 等可能会无法正确处理由 XmlDocument.LoadXml() 得到的 XML。
另,改用 XML 1.1 也是一种解决方案,XML 1.1 的非法字符仅有 NUL (x00)、xFFFE 与 xFFFF 这三个。
用于匹配 XML 1.0 非法字符的正则表达式模式如下:
1 |
(([0-8|B|C|E-Z])|([0-1][0-9A-Z])|(D[8-9|A-F]..)|(FFFE|FFFF)|([1-9A-F][1-9|A-F]....)|(.{7,})); |
VB.NET 代码示例:
1 2 3 4 5 6 7 |
Public Function RemoveInvalidXmlChars(ByVal xmlString As String) As String If Not xmlString Is Nothing Then Return Regex.Replace(xmlString, "(([0-8|B|C|E-Z])|([0-1][0-9A-Z])|(D[8-9|A-F]..)|(FFFE|FFFF)|([1-9A-F][1-9|A-F]....)|(.{7,}));", String.Empty) Else Return xmlString End If End Function |