2016-10-30 3 views
-1

Я передаю данные XML на сервер из текстового окна, теперь проблема заключается в том, что XML дает проблемы с такими символами, как & < |. Поэтому я хочу заменить эти символы на их эквивалентные коды.Замена специального символа на их коды

если я использую функцию string.replace, она заменит замененные символы.

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

Как только он проходит полную цепочку снова и снова. Так & < # станет "&&#35;38;&&#35;60;"

Я также попытался словарь метод:

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; 

Но тот же вопрос здесь. Я также попробовал метод строкового построителя, но тот же повторяющийся вопрос о замене. Любой совет?

+0

Рассмотрите возможность использования регулярного выражения. –

+2

Есть хорошо установленные способы избежать/unescape XML-значений и построить XML с правильно экранированными значениями в нем. Нет никакой пользы от попыток сделать свой собственный с нуля. Я бы посоветовал, как это сделать, но не совсем ясно, что вы пытаетесь сделать (где код, который вы используете для построения XML)? Сосредоточение вашего вопроса вокруг этого, вероятно, даст вам гораздо более плодотворную информацию. – JLRishe

+0

Если у вас есть доступ, вы можете попробовать [HttpServerUtility.HtmlEncode] (https://msdn.microsoft.com/en-us/library/w3te6wfz (v = vs.110) .aspx) –

ответ

-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; 
    } 
+0

В этом случае было бы лучше использовать построитель строк. – andyroschy

+0

@ user1118759 спасибо, что это сработало. –

+0

@NisarAfridi Хотя это будет успешно заменять символы в строке, как я уже указывал, это ** неправильный способ решить вашу проблему. Заданный вами вопрос - проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – JLRishe

2

Вы не должны пытаться избегать символов вручную. Существуют библиотеки и методы, которые уже созданы для этого, такие как SecurityElement.Escape(). Это особенно ускользает от недопустимых символов XML в известный безопасный формат, который позже может быть отменен.

+0

Это один из способов избежать значений в XML, но похоже, что OP пытается создать XML из строк вручную, что предполагает, что они должны использовать совершенно другой подход. – JLRishe

+0

Тогда у ОП есть две проблемы: P – Soviut

+0

@Soviut 'SecurityElement.Escape()' dont have | sign. Мое мышление состояло в простой замене символов из строки. Я хотел заменить эти все символы : [link] (https://www.dvteclipse.com/documentation/svlinter/How_to_use_special_characters_in_XML.3F.html#gsc.tab = 0) –

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); 
+0

спасибо, попробуем этот метод. –

Смежные вопросы