Quick & amp; Mauvaise façon de mettre à jour les «ID» dans une chaîne au format XML (C #)
Question
Pour une opération ponctuelle, j’ai besoin d’analyser le contenu d’une chaîne XML et de modifier les numéros de "ID". champ. Cependant, je ne peux pas risquer de changer quoi que ce soit de la chaîne, par exemple. les espaces, les sauts de ligne, etc. DOIVENT rester tels quels!
Depuis que j'ai fait l'expérience que XmlReader a tendance à gâcher l'espace et à reformater votre XML, je ne veux pas l'utiliser (mais n'hésitez pas à me convaincre du contraire). Cela crie aussi pour RegEx mais ... je ne suis pas bon en RegEx, surtout pas avec l'implémentation .NET.
Voici une courte partie de la chaîne, le numéro du champ ID doit être mis à jour dans certains cas. Il peut y avoir beaucoup d'entrées de ce type dans la chaîne. J'ai donc besoin de convertir chaque ID en Int32, comparer & amp; modifiez-le, puis remettez-le dans la chaîne.
<VAR NAME="sf_name" ID="1001210">
Je recherche le moyen le plus simple (en termes de temps de codage) et le plus sûr.
La solution
Le motif de regex que vous recherchez est:
ID="(\d+)"
Le groupe de correspondance 1 contiendrait le numéro. Utilisez un Délégué MatchEvaluator pour remplacer les correspondances par remplacements calculés dynamiquement.
Regex r = new Regex("ID=\"(\\d+)\"");
string outputXml = r.Replace(inputXml, new MatchEvaluator(ReplaceFunction));
où ReplaceFunction
est semblable à ceci:
public string ReplaceFunction(Match m)
{
// do stuff with m.Groups(1);
return result.ToString();
}
Si vous en avez besoin, je peux développer Regex pour qu'il corresponde plus précisément. Actuellement, toutes les valeurs d'ID (contenant uniquement des chiffres) sont remplacées. Vous pouvez également créer ce petit " intelligence supplémentaire " dans la fonction d’évaluation des correspondances et faites-la renvoyer la correspondance inchangée si vous ne souhaitez pas la modifier.
Autres conseils
Consultez cette propriété PreserveWhitespace dans XmlDocument , classe