Faire cela avec une recherche de texte et de remplacement doit être fait en utilisant StringBuilder
pour éviter les problèmes normaux de la création de chaînes dans une boucle (beaucoup de déchets). Il est également très difficile d'éviter les faux positifs (si le texte correspondant de l'attribut se produit dans un nœud de texte?)
meilleures options, avec différents compromis comprennent:
- Charger dans XDocument ou XmlDocument, itérer le arbre remplaçant les attributs correspondants.
- Utiliser un XSLT
- Lire à partir d'un XmlReader et écrire directement dans un XmlWriter, avec des attributs modifiés.
De ces # 3 évite de charger le document entier en mémoire. # 2 requiert des compétences XSLT mais autorise facilement un nombre arbitraire de remplacements (le noyau du XSLT pourrait être un modèle, avec les nouvelles, anciennes paires d'attributs injectées lors de l'exécution). # 1 est susceptible d'être le plus simple, mais avec le document entier en mémoire, et les frais généraux de gestion de multiples remplacements.
Je regarderais probablement XSLT avec l'approche de Xml Reader/Writer comme sauvegarde.
Cependant # 1 devrait être plus simple à mettre en œuvre, quelque chose comme (en ignorant les espaces de noms XML entre autres détails):
using System.Xml.Linq;
using System.Xml.XPath;
var xdoc = XDocument.Load(....);
var nav = xdoc.CreateNavigator();
foreach (repl in replacements) {
var found = (XPathNodeIterator) nav.Evaluate("//@" + repl.OldName);
while (found.MoveNext()) {
var node = found.Current;
var val = node.Value;
node.DeleteSelf(); // Moves ref to parent.
node.CreateAttribute("", repl.NewName, "", val);
}
}
Le choix final dépendra des performances d'équilibrage (en particulier la mémoire si vous travaillez avec de grands documents) et de la complexité . mais seulement vous (et votre équipe) pouvez faire cet appel.
Bonne question (+1). Voir ma réponse pour une solution XSLT complète - probablement l'une des plus simples possibles. –