2014-01-03 5 views
0

У меня есть программа, которая отправляет письма с использованием шаблонов через веб-службу. Чтобы проверить шаблоны, я сделал простую программу, которая читает шаблоны, заполняет ее фиктивным значением и отправляет ее. Проблема заключается в том, что шаблоны имеют разные имена «fill in». Поэтому я хочу открыть шаблон, составить список переменных, а затем заполнить их фиктивным текстом.StreamReader получить строку между определенными символами

Право нет у меня есть что-то вроде:

StreamReader SR = new StreamReader(myPath); 
.... //Email code here 
Msg.Body = SR.ReadToEnd(); 
SR.Close(); 

Msg.Body = Msg.Body.Replace(%myFillInVariable%, "Test String"); 
.... 

так что я думаю, открыв шаблон, поиск значений между «%» и поместить их в ArrayList, а затем сделать Msg.Body = SR.ReadToEnd(); часть. Переверните ArrayList и выполните часть Заменить, используя значение массива.

То, что я не могу найти, - это прочитать значение между тегами%. Будем очень благодарны за любые предложения о том, какой метод использовать.

Спасибо,

ПОДРОБНЕЕ:

Извините, если я не ясно. Я передаю имя TEMPLATE сценарию из раскрывающегося списка. У меня может быть несколько десятков шаблонов, и у всех их есть разные% VariableToBeReplace%. Вот почему я хочу прочитать шаблон с помощью StreamReader, найти все имена%%%, поместить их в массив И затем заполнить их, что я уже знаю, как это сделать. Он получает имя того, что мне нужно заменить в коде, который я не знаю, что делать.

+0

Я запутался. Вы предлагаете, чтобы ваша программа могла искать исходный код в программе, а затем динамически менять его? – STLDeveloper

ответ

2

Я не уверен, что на ваш вопрос либо, но вот пример того, как сделать замену.

Вы можете запустить и проиграть с помощью этого примера в LinqPad.

Скопируйте этот материал в файл и измените путь к тому, что вы хотите. Содержание:

Hello %FirstName% %LastName%, 

We would like to welcome you and your family to our program at the low cost of %currentprice%. We are glad to offer you this %Service% 

Thanks, 
Some Person 

Код:

var content = string.Empty; 
using(var streamReader = new StreamReader(@"C:\EmailTemplate.txt")) 
{ 
    content = streamReader.ReadToEnd(); 
} 

var matches = Regex.Matches(content, @"%(.*?)%", RegexOptions.ExplicitCapture); 

var extractedReplacementVariables = new List<string>(matches.Count); 
foreach(Match match in matches) 
{ 
    extractedReplacementVariables.Add(match.Value); 
} 

extractedReplacementVariables.Dump("Extracted KeyReplacements"); 

//Do your code here to populate these, this part is just to show it still works 
//Modify to meet your needs 
var replacementsWithValues = new Dictionary<string, string>(extractedReplacementVariables.Count); 
for(var i = 0; i < extractedReplacementVariables.Count; i++) 
{ 
    replacementsWithValues.Add(extractedReplacementVariables[i], "TestValue" + i); 
} 

content.Dump("Template before Variable Replacement"); 

foreach(var key in replacementsWithValues.Keys) 
{ 
    content = content.Replace(key, replacementsWithValues[key]); 
} 

content.Dump("Template After Variable Replacement"); 

Результат от LINQPad: LinqPad Results

+0

Спасибо за ответ. Довольно чистый код. Проблема в том, что это предполагает, что я знаю имя переменных, чего я не делаю, потому что я могу использовать другой шаблон и у них разные% имен%. – Diomedes

+0

Я добавил дополнительное описание на исходный вопрос. – Diomedes

+0

OK Я обновлю свой пример, чтобы включить его. –

0

Я не уверен, что понял ваш вопрос, но вы можете попытаться наложить первую строку шаблона на свою «заполняющую переменную».

Что-то вроде:

StreamReader SR = new StreamReader(myPath); 
String fill_in_var=SR.ReadLine(); 
String line; 
while((line = SR.ReadLine()) != null) 
{ 
    Msg.Body+=line; 
} 
SR.Close(); 

Msg.Body = Msg.Body.Replace(fill_in_var, "Test String"); 
Смежные вопросы