Gérer l'indentation d'un flux xml

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 227 fois - Téléchargée 26 fois

Contenu du snippet

Ce petit sample permet de gérer dynamiquement l'indentation d'un flux XML. L'objectif est de monter comment passer d'un flux indenté à un flux en ligne et inversement afin de gagner un peu de place (et oui, les espaces et les retours chariot ne sont pas négligeables )

Source / Exemple :


using System;
using System.Xml;
using System.IO;

namespace CodesSources.XML
{
  /// <summary>
  /// Description résumée de Sample.
  /// </summary>
  class Sample
  {
    /// <summary>
    /// Point d'entrée principal de l'application.
    /// </summary>
    /// <example>
    ///  ***.exe	"chemin au fichier XML source" ,
    ///				"chemin au fichier XML résultat" ,
    ///				[Y/N],
    ///				"nombre de d'espace pour l'indentation"
    ///	***.exe "../test.xml", "../testResult.xml", "Y", 4
    ///	***.exe "../test.xml", "../testResult.xml", "N"
    /// </example>
    [STAThread]
    static void Main(string[] args)
    {

      string sIndent =  "Y";
      if (args[2].Length > 0 || args[2] != null ) 
        sIndent=args[2];
	
      bool bIndent = (sIndent == "Y"); //(valeur booléene)

      int iSpaceIndent = 0;
      if (sIndent.Equals("Y"))
      {
        if ( args[3] != null || args[3].Length > 0 )
          iSpaceIndent = Convert.ToInt32(args[3]);
      }

      //on initialise la classe IndentXml
      IndentXml oIndXMl = new IndentXml();

      //on lit le flux du fichier XML à traiter
      StreamReader osRd = new StreamReader(args[0]);
      string sFlux = osRd.ReadToEnd();
      osRd = null;

      /* Appel de la calsse d'indentation */
      //on effectue la transformation
      oIndXMl.sFluxXMLOriginal = sFlux;
      string sResult = oIndXMl.Execute(bIndent,iSpaceIndent);
      oIndXMl=null;
      /* Fin d'appel */

      // on génére le fichier résultat ;
      StreamWriter osWr = new StreamWriter(args[1],false);
      osWr.Write(sResult);
      osWr.Flush();
      osWr.Close();

    }
  }

  class IndentXml
  {
    public string sFluxXMLOriginal;

    public IndentXml()
    {
    }

    /// <summary>
    /// Cette fonction s'appuie sur un XmlDoc qui vas piloter un XmlTextWriter
    /// </summary>
    /// <param name="bIndentation"></param>
    /// <param name="iNombreIndent"></param>
    /// <returns>le flux retouché</returns>
    public string Execute(bool bIndentation, int iNombreIndent)
    {
      XmlDocument oxDoc = new XmlDocument();
      StringWriter ostw = new StringWriter();
      XmlTextWriter oxtWrt = new XmlTextWriter(ostw);

      //on charge le flux XML
      oxDoc.LoadXml(sFluxXMLOriginal);

      //on paramétre le XmlTextWriter pour la génération du flux de sortie
		
      if (bIndentation)
      {
        oxtWrt.Formatting = Formatting.Indented;
        oxtWrt.Indentation = iNombreIndent;
        oxtWrt.IndentChar = ' ';
      }
      else
      {
        oxtWrt.Formatting= Formatting.None;
      }

      //le XmlDoc pilote automatiquement le XmlTextWriter
      oxDoc.WriteTo(oxtWrt);
      //On renvoit le flux de sortie du writer
      return ostw.ToString();

    }
  }
}

Conclusion :


Cet exemple s'appuie sur des fichiers sur le disque pour la demo mais je l'utilise surtout pour renvoyer le flux en sortie indenté en debug dans un textarea ou la console.

Le code vraiment sympathique se trouve dans la classe IndentXml

A noter que l'on peut aussi changer le caractère d'indentation via la propriété IndentChar du xmlTextWriter.

Voilà voilà
(Mon premier source en ligne , snif c'est beau)

A voir également

Ajouter un commentaire

Commentaires

TheSaib
Messages postés
2369
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
13 -
Ce n'est pas pour être desobligeant mais je crois qu'il y a une classe préfaite pour indenter les Fichiers XML dans le framework ...

Je verifierais a l'occasion ;)
k_wa
Messages postés
32
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
20 septembre 2006
-
pour répondre à TheSaib, effectivement...:

using (StringWriter body = new StringWriter())
{
XmlWriterSettings set = new XmlWriterSettings();
set.Indent = true;
set.Encoding = Encoding.UTF8;
using (XmlWriter writer = XmlWriter.Create(body, set))
{
// insert code here
}
}

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.