通过正则表达式过滤/去除 XML 1.0 的非法字符

说明:
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 非法字符的正则表达式模式如下:

(([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 代码示例:

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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注