[C#] Regex balise + saut à la ligne

Résolu
FlolZ Messages postés 5 Date d'inscription mercredi 16 avril 2014 Statut Membre Dernière intervention 17 avril 2014 - 16 avril 2014 à 15:20
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 - 17 avril 2014 à 18:01
Bonjour,

Je travaille en ce moment sur la réécriture d'un fichier XML, de ce fait je doit en supprimer certaines parties. Pour cela je souhaiterais utiliser les regex. Je vous montre le code, ce sera plus explicite je pense.

Ici un bout d'exemple d'un fichier XML sur lequel je travail :
<GlobalResources>
<StringResource
id="responseLocked"
value="This item is locked.
You cannot change this answer."/>
<StringResource
id="doYouMean"
value="Do you mean '%1' ?"/>
<StringResource
id="outOfTime"
value="The allowed time has expired.
You cannot change this answer."/>
<StringResource
id="outOfTries"
value="The allowed number of tries has been reached.
You cannot change this answer."/>
<StringResource
id="questionLocked"
value="This question is locked."/>
<StringResource
id="scoreIsX"
value="Score: %1%%"/>
<StringResource
id="scoreIsXOutOfX"
value="Score: %1 out of %2"/>
</GlobalResources>

Ce que je souhaiterais, c'est effacer l'ensemble des caractères présent entre les balises <GlobalResources></GlobalResources>(balises comprises). Le problème que j'ai dans la rédaction de ma regex, c'est que j'arrive à faire ce que je veux, seulement lorsque le code est en ligne, mais dés que je le remet à sa forme initial(avec les sauts à la ligne etc...), rien ne ce passe.

Voici ma regex :
Regex objRegExp = new Regex("<GlobalResources>(.*?)</GlobalResources>");
fileWrite.WriteLine(objRegExp.Replace(line, String.Empty));

Donc ma question serait plutôt, comment prendre en compte les retours à la ligne dans une regex ?

J'ai tenté plusieurs solutions avec ce que j'ai trouvé sur le net, mais impossible d'avoir le rendu souhaité. Si l'un d'entre vous pouvait m'éclairer, cela m'aiderai grandement.

En vous souhaitant une bonne journée !
A voir également:

6 réponses

Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
16 avril 2014 à 18:04
Bonsoir,

ici un code source qui te permets de tester tes regex.

Par contre, je ne suis pas sûr que tu t'y prennes bien, il y a pleins de bon outils pour parser et serialiser des fichiers xml.
Il te suffit de parser ton fichier et de le serialiser sans la données que tu souhaites enlever.
Voir ici ou pour des exemples en Linq To Xml
1
jordane45 Messages postés 38137 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
16 avril 2014 à 15:27
Bonjour,

Et comme ceci ?
Regex objRegExp = new Regex("<GlobalResources>(.*?)</GlobalResources>",RegexOptions.Singleline);

0
FlolZ Messages postés 5 Date d'inscription mercredi 16 avril 2014 Statut Membre Dernière intervention 17 avril 2014
Modifié par FlolZ le 16/04/2014 à 15:32
Merci de ta réponse.

Mais j'ai déjà essayé avec ce paramètre, sans résultat.
J'ai également testé ceci :
Regex objRegExp = new Regex("<GlobalResources>(.*?)</GlobalResources>",RegexOptions.Multiline);

Mais encore une fois, pas de résultat.
0
FlolZ Messages postés 5 Date d'inscription mercredi 16 avril 2014 Statut Membre Dernière intervention 17 avril 2014
16 avril 2014 à 15:41
Voici ma méthode, peut-être que l'erreur ce trouve en amont de la regex

   public static void RemoveTag(){

StreamReader newR = new StreamReader(@"MonTexte.txt");
StreamWriter newW = new StreamWriter(@"MonTexteFinal.txt");

string line;

while ((line = newR.ReadLine()) != null)
{
Regex objRegExp = new Regex("<GlobalResources>(.*?)</GlobalResources>");
newW.WriteLine(objRegExp.Replace(line, String.Empty));
}
//Close the file
newW.Close();
newR.Close();
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
FlolZ Messages postés 5 Date d'inscription mercredi 16 avril 2014 Statut Membre Dernière intervention 17 avril 2014
17 avril 2014 à 09:06
Bonjour,

tout d'abord, merci de ta réponse. Je vais allez jeter un oeil sur les liens que tu me proposes et je reviens vers vous si j'ai réussi à résoudre mon problème. Bonne journée !
0
FlolZ Messages postés 5 Date d'inscription mercredi 16 avril 2014 Statut Membre Dernière intervention 17 avril 2014
Modifié par FlolZ le 17/04/2014 à 10:00
Re,

Merci encore une fois de ton aide Whismeril. En fait j'ai réussi à faire ce que je voulais en me simplifiant environ 1000 fois la vie ! J'ai vu qu'il été possible d'utiliser XDocument ou XElement. Pour ma part j'ai opté pour XDocument, sans vraiment savoir pourquoi, tant que ça marche. Je me suis aidé de ces liens:

Celui, très bien fait je trouve
http://www.dotnetcurry.com/showarticle.aspx?ID=564

et celui-ci
http://stackoverflow.com/questions/4481622/xdocument-deleting-a-node

Même si au final il n'y a rien de compliqué, cela pourra être utile pour d'autres. Voici comment je me suis débarrassé de mon noeud <GlobalResource> :

            XDocument doc = XDocument.Load(@"MonDocument.xml");
doc.Descendants("GlobalResources").Remove();
doc.Save(@"MonNouveauDocument.xml");

Encore merci et bonne journée !
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
17 avril 2014 à 18:01
De rien.
0
Rejoignez-nous