2009-11-19 1 views
0

Я пытаюсь написать приложение для исправления ошибок app.config/web.config, которое проверит наши приложения-разработчики на неправильные настройки среды. Я использую Linq для XML, чтобы выполнить это, и я попадаю в ловушку.Обновление вопросов конкатенации значений элементов Linq to XML

var query = 
    from el in doc.Descendants().Element("SMTPHost") 
    select el; 

foreach (XElement host in query) 
{ 
    if (Regex.IsMatch(el.Value, "mail.mycompany.com") 
    { 
     el.Value = Regex.Replace(el.Value, 
      "mail.mycompany.com", "devmail.mycompany.com"); 

    } 
} 

Когда я запускаю это, объединяющее все текстовые значения дочерних для одного из предков узлов правильного элемента и удаляет все дочерние элементы.

Есть ли лучший способ сделать такие вещи?

Спасибо!

ответ

3

Во-первых, я думаю, что использование вами регулярных выражений здесь не нужно. Вы знаете, что будет соответствовать «mailxmycompanyxcom» из-за того, как совпадают точки? Использование String.Contains и String.Replace. Конечно, если ваш реальный код использует подлинные шаблоны, это другое дело.

В любом случае, на вопрос. Это звучит для меня, как будто вас интересует только обработка одного дочернего узла за раз - это правильно? Если это так, используйте:

var query = doc.Descendants() 
       .Element("SMTPHost") 
       .DescendantNodes() 
       .OfType<XText>(); 

foreach (XText textNode in query) 
{ 
    textNode.Value = textNode.Value.Replace("mail.mycompany.com", 
              "devmail.mycompany.com"); 
} 
+0

Вы пригвоздили его благодаря! –

+0

Большое спасибо за пример использования OfType() ... спас мой бекон сегодня. – CarlS