2009-11-19 4 views
0

J'essaie d'écrire une application de correction d'erreurs app.config/web.config qui va auditer nos applications de développeurs pour les paramètres d'environnement incorrects. J'utilise Linq en XML pour accomplir ceci et je suis en train de faire un accroc.Mise à jour des problèmes de concaténation des valeurs d'élément XML Linq

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"); 

    } 
} 

Quand je lance cela, il enchaîne toutes les valeurs de texte de l'enfant pour l'un des nœuds ancêtres de l'élément correct et supprime tous les éléments de l'enfant.

Y a-t-il une meilleure façon de faire ce genre de chose?

Merci!

Répondre

3

Premièrement, je pense que votre utilisation d'expressions régulières n'est pas nécessaire ici. Savez-vous que cela correspondra à "mailxmycompanyxcom" à cause de la correspondance des points? Utilisation de String.Contains et String.Replace. Bien sûr, si votre vrai code utilise des patrons authentiques, c'est différent.

En tout cas, sur le problème. J'ai l'impression que vous ne voulez traiter qu'un seul nœud enfant à la fois, n'est-ce pas? Si oui, utilisez:

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

Vous l'avez cloué merci! –

+0

Merci beaucoup pour l'exemple de l'utilisation de OfType() ... sauvé mon bacon aujourd'hui. – CarlS

Questions connexes