Quick & amp; Mauvaise façon de mettre à jour les «ID» dans une chaîne au format XML (C #)

StackOverflow https://stackoverflow.com/questions/258694

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.

Était-ce utile?

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top