Gérer l'indentation d'un flux xml

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

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.