用他们的代码替换特殊字符

时间:2016-10-30 17:43:40

标签: c# string

我正在从文本框中将XML数据传递到服务器,现在问题是XML正在出现像&这样的符号问题。 < |。所以我想用等效的代码替换这些符号。

如果我使用string.replace函数,它将替换最近替换的字符。

.Replace("&", "&")
.Replace("<", "&#60;")
.Replace("|", "&#124;")
.Replace("!", "&#33;")
.Replace("#", "&#35;")

一遍又一遍地完成整个字符串。 所以&amp;&lt;#将成为&#34; &&#35;38;&&#35;60;&#34;

我也尝试过Dictionary方法:

  var replacements = new Dictionary<string, string> 
            { 
            {"&", "&#38;"}, 
            {"<", "&#60;"}, 
            {"|", "&#124;"},
            {"!", "&#33;"},
            {"#", "&#35;"}
}
var output = replacements.Aggregate(input, (current, replacement) => current.Replace(replacement.Key, replacement.Value));
return output;

但同样的问题也在这里。我也尝试过字符串构建器方法,但同样重复替换问题。任何建议?

3 个答案:

答案 0 :(得分:2)

您不应该尝试手动转义字符。已经构建了用于执行此操作的库和方法SecurityElement.Escape()。它专门将无效的XML字符转换为以后可以转义的已知安全格式。

答案 1 :(得分:0)

我强烈建议使用正确的XML处理来构建XML:

var id = 3;
var message = "&'<crazyMessage&&";

var xmlDoc = new XmlDocument();

using(var writer = xmlDoc.CreateNavigator().AppendChild())
{
    writer.WriteStartElement("ROOT");

    writer.WriteElementString("ID", id.ToString());

    writer.WriteStartElement("INPUT");
    writer.WriteElementString("ENGMSG", message);
    writer.WriteEndElement(); // INPUT

    writer.WriteEndElement(); // ROOT
}

var xmlString = xmlDoc.InnerXml;
Console.WriteLine(xmlString);

Ideone example

如果您使用的是.NET 3.5或更高版本,则可以使用Linq2Xml构建XML,这样更清晰:

var id = 3;
var message = "&'<crazyMessage&&";

var xml = new XElement("ROOT", 
    new XElement("ID", id),
    new XElement("INPUT", 
        new XElement("ENGMSG", message)
    )
);

var xmlString = xml.ToString();
Console.WriteLine(xmlString);

答案 2 :(得分:-3)

public static string Transform(string input, Dictionary<string, string> replacements)
    {
        string finalString = string.Empty;
        for (int i = 0; i < input.Length; i++)
        {
            if (replacements.ContainsKey(input[i].ToString()))
            {
                finalString = finalString + replacements[input[i].ToString()];
            }
            else
            {
                finalString = finalString + input[i].ToString();
            }
        }

        return finalString;
    }