如何修复以下Xml编码功能?

时间:2011-08-15 17:21:02

标签: xml vb.net

我有以下功能:

Private Function XMLEncode(ByVal s As String) As String
        Return s.Replace("&", "&amp;").Replace("<", "&lt;").Replace(">", "&gt;").Replace("'", "&apos;").Replace("""", "&quot;").Replace("AMP",amp)
    End Function

但上面的字符串为"TYNE &AMP; WEAR"并生成:

TYNE &amp;amp; WEAR

我只想让它成为TYNE &amp; WEAR

xml是使用StringBuilder构建的,这就是我现在所困扰的。我知道.net会为你解决这个问题。

2 个答案:

答案 0 :(得分:1)

更新

Private Function XMLEncode(ByVal s As String) As String
        s = Regex.Replace(s, "(?i)&amp;", "&")   ' unescape escaped ones
        Return s.Replace("&", "&amp;").Replace("<", "&lt;").Replace(">", "&gt;").Replace("'", "&apos;").Replace("""", "&quot;")
    End Function

您可以使用SecurityElement.Escape来代替自己拥有此功能(并重新发明轮子):

text = SecurityElement.Escape(s)

HttpUtility.HtmlEncode(如果你在ASP.Net中)

text = HttpUtility.HtmlEncode(s)

此外,如果您可以切换到XmlTextWriter而不是StringBuilder,那么XmlTextWriter.WriteString()将为您进行转义。

答案 1 :(得分:1)

由于您不想双重转义xml标记,请考虑使用不会双重转义xml的正则表达式替换。

' encode "&", but not "&amp;", "&gt;", "&lt;", or "&quot;".'
s = Regex.Replace (s, "&(?!(?:amp|lt|gt|quot);)", "&amp;", RegexOptions.IgnoreCase)
' encode other xml characters.'
Return s.Replace("<", "&lt;").Replace(">", "&gt;").Replace("'", "&apos;").Replace("""", "&quot;").Replace("AMP",amp)