Si votre patron a toujours raison, et que vous ne vous pouvez pas vous permettre de lui demontrer le contraire, ce bout de code qui suit que je viens d'ecrire et tester devrait aider.
Notez que c'est ecrit pour avoir de bonnes performances sur de tres gros fichiers, sans devoir "sucer" tous le XML en memoire (le probleme qu'on a si on passe par les APIs XML .NET classiques ou si on travaille avec des expressions regulieres sur le texte).
Cependant :
* c'est du C#, faudra adapter pour VB.NET (désolé, je suis plus fluent en C# qu'en VB...)
* pour des perfs encore meilleures, faudra re ecrire mes string.Concat en utilisant un StringBuilder a la place, pour le StreamWriter (sw) ; je vous laisse ca en exercice.. ;)
* faudra adapter egalement si vous voulez ajouter CRLF apres les tags sans enfants du type "<foobar/>" (vous ne nous avez pas precisé pour ce cas particulier...)
'HTH
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
StreamWriter sw = new StreamWriter("d:\\app\\append_crlf\\append_crlf\\result.xml");
using (StreamReader sr = new StreamReader("d:\\app\\append_crlf\\append_crlf\\test.xml"))
{
string line = sr.ReadLine();
bool lineDone = false;
while (!sr.EndOfStream || !lineDone)
{
if(lineDone)
line = sr.ReadLine();
if (String.IsNullOrEmpty(line))
continue;
int endTagMarkIndex = line.IndexOf("</"); // on cherche "...</..."
if (endTagMarkIndex >= 0)
{
string head = line.Substring(0, endTagMarkIndex);
string endTagTail = line.Substring(endTagMarkIndex + 2); // recup de "...>..." apres "</"
int endTagEnd = endTagTail.IndexOf('>'); // index de ">" dans tail
string newEndTag = String.Concat(
"</",
endTagTail.Substring(0, endTagEnd), // nom du tag dans "</nomDuTag>"
">",
"\r\n");
string newLine = String.Concat(head, newEndTag);
sw.Write(newLine);
line = endTagTail.Substring(endTagEnd + 1);
lineDone = (line == String.Empty);
}
else
{
sw.WriteLine(line);
lineDone = true;
}
}
}
sw.Close(); |