• Blog
  • Bio

Eric Boumendil

Indenter un flux XML

1 décembre 2009 // archives .net c#
Cet article est très ancien. Les choses ont bien changées depuis 2009. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.
Cet article est susceptible de référencer des images manquantes ou de contenir des erreurs de formatage sur son contenu. Il s'agit d'un import provenant d'un ancien blog.

Le code ci-dessous crée un flux XML non indenté et utilise les objets XmlReader et XmlWriter pour le lire et le reformater de façon à l’indenter. Tout se trouve dans la méthode GetIndentedXml.

Il s’agit d’un programme Console, donc vous pouvez le tester tel quel en le collant dans un fichier Program.cs d’un projet Console.

 1using System;
 2using System.Text;
 3using System.Xml;
 4using System.IO;
 5
 6namespace ConsoleXmlDemo
 7{
 8    class Program
 9    {
10        /// <summary>
11        /// Retourne un flux XML sans indentation
12        /// </summary>
13        /// <returns></returns>
14        static MemoryStream GetRawXml()
15        {
16            return new MemoryStream(ASCIIEncoding.UTF8.GetBytes(@"<Root>
17    <Example id=""1"" >
18<Sub>Text</Sub>
19</Example>
20<Example       id=""2""><Sub>Text 2</Sub></Example></Root>
21"),false);
22        }
23
24        /// <summary>
25        /// Retourne un flux XML avec indentation
26        /// </summary>
27        /// <param name="inputXml">Flux de XML brut pouvant être lu</param>
28        /// <returns></returns>
29        static MemoryStream GetIndentedXml(Stream inputXml)
30        {
31            if (inputXml == null)
32                throw new ArgumentNullException("inputXml");
33            if (!inputXml.CanRead)
34                throw new ArgumentException("Le flux ne peut être lu.");
35
36            MemoryStream ms = new MemoryStream();
37
38            XmlWriter writer = XmlWriter.Create(
39            ms,
40            new XmlWriterSettings()
41            {
42                Indent = true,
43                IndentChars = "\t",
44            }
45                );
46
47            using (XmlReader reader = XmlReader.Create(
48                inputXml,
49                new XmlReaderSettings()
50                {
51                    CloseInput = true,
52                    IgnoreWhitespace = true
53                }
54                ))
55            {
56                writer.WriteNode(reader, true);
57            }
58
59            writer.Close();
60            return ms;
61
62        }
63
64        static void Main(string[] args)
65        {
66            Console.WriteLine("Xml brut:");
67            Console.WriteLine(ASCIIEncoding.UTF8.GetString(GetRawXml().ToArray()));
68
69            Console.WriteLine("Xml formaté:");
70            Console.WriteLine(ASCIIEncoding.UTF8.GetString(GetIndentedXml(GetRawXml()).ToArray()));
71
72            Console.WriteLine("Appuyez sur une touche pour terminer...");
73            Console.ReadKey();
74        }
75    }
76}

L’important pour que cela fonctionne est à la ligne 52:

IgnoreWhitespace = true

En effet, le formatage ne fonctionne pas si le code XML lu contient des caractères blancs.

La sortie produite est la suivante :

Xml brut:
<Root>
    <Example id="1" >
<Sub>Text</Sub>
</Example>
<Example       id="2"><Sub>Text 2</Sub></Example></Root>

Xml formaté:
?<?xml version="1.0" encoding="utf-8"?>
<Root>
        <Example id="1">
                <Sub>Text</Sub>
        </Example>
        <Example id="2">
                <Sub>Text 2</Sub>
        </Example>
</Root>
Appuyez sur une touche pour terminer...
← 
Petit memento sur les opérations sur les bits en C#
Réutiliser une librairie .NET dans un projet Silverlight
 →
 
© 2026 Eric Boumendil
Haut de page