[C#] Regex balise + saut à la ligne [Résolu]

Messages postés
5
Date d'inscription
mercredi 16 avril 2014
Dernière intervention
17 avril 2014
- - Dernière réponse : Whismeril
Messages postés
12370
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
- 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 !
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
12370
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
1
Merci
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

Merci Whismeril 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de Whismeril
Messages postés
23584
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 décembre 2018
0
Merci
Bonjour,

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

Commenter la réponse de jordane45
Messages postés
5
Date d'inscription
mercredi 16 avril 2014
Dernière intervention
17 avril 2014
0
Merci
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.
Commenter la réponse de FlolZ
Messages postés
5
Date d'inscription
mercredi 16 avril 2014
Dernière intervention
17 avril 2014
0
Merci
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();
}
Commenter la réponse de FlolZ
Messages postés
5
Date d'inscription
mercredi 16 avril 2014
Dernière intervention
17 avril 2014
0
Merci
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 !
Commenter la réponse de FlolZ
Messages postés
5
Date d'inscription
mercredi 16 avril 2014
Dernière intervention
17 avril 2014
0
Merci
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 !
Whismeril
Messages postés
12370
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
-
De rien.
Commenter la réponse de FlolZ

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.