перевести специальный символ в строку

У меня есть программа, которая читает XML-документ. В этом XML-документе некоторые атрибуты содержат специальные символы, такие как «\n», «\t» и т. д.

Есть ли простой способ заменить все эти строки фактическим символом или мне просто нужно сделать это вручную для каждого символа, как в следующем примере?

Пример вручную:

s.Replace("\\n", "\n").Replace("\\t", "\t")...

редактировать:

Я ищу способ обрабатывать строку как экранированную строку (хотя я знаю, что это не работает)

s.Replace("\\", "\");

person Tony Brix    schedule 20.03.2014    source источник
comment
Проверьте это: stackoverflow.com/questions/11584148/   -  person bosnjak    schedule 21.03.2014
comment
Пожалуйста, покажите пример XML, о котором вы говорите. \n не является специальным символом в XML.   -  person John Saunders    schedule 21.03.2014
comment
Он может иметь значение, содержащее специальные символы в XML.   -  person bosnjak    schedule 21.03.2014


Ответы (2)


Попробуйте Regex.Unescape().

Официальные документы здесь: http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.unescape(v=vs.110).aspx

person Manuel Spezzani    schedule 21.03.2014
comment
Это довольно аккуратно. Может пригодится. - person GregRos; 21.03.2014
comment
Это именно то, что я искал. - person Tony Brix; 21.03.2014

Почему бы просто не пройтись по документу и не создать новую строку за один проход. Сохраняет много повторяющихся поисков и промежуточных распределений

string ConvertSpecialCharacters(string input) {
  var builder = new StringBuilder();
  bool inEscape = false;
  for (int i = 0; i < input.Length ; i++) {
    if (inEscape) {
     switch (input[i]) {
      case 'n':  
        builder.Append('\t');
        break;
      case 't':
        builder.Append('\n');
        break;
      default:
        builder.Append('\\');
        builder.Append(input[i]);
    }
    else if (input[i] == '\\' && i + 1 < input.Length) {
      inEscape = true;
    }
    else {
      builder.Append(input[i]);
    } 
  }
  return builder.ToString();
}
person JaredPar    schedule 20.03.2014
comment
но это потребовало бы от меня ввода всех экранирующих символов в качестве регистров. Я ищу способ этого не делать. Я отредактировал вопрос, чтобы показать, что я ищу. - person Tony Brix; 21.03.2014