Chargement d'un fichier XML dans un TreeView

Introduction

Je cherchais une bribe de code permettant d'alimenter un TreeView à partir d'un fichier XML dont le schéma est défini (ce source est en fait une base pour un agrégateur RSS, me permettant de charger les flux mémorisés; je ne sais si cette solution sera satisfaisante par la suite, mais tout l'intérêt pédagogique est là).
N'ayant pu trouver de résultat satisfaisant, je vous livre ici la façon dont j'ai procédé.

Description des données

Tout d'abord le fichier XML (pas le plus intéressant, mais indispensable), basé sur un schéma interne au programme :

<?xml version="1.0" encoding="utf-8" ?>
<donnees>
   <dossier>
        <nom_dossier>OpenRSS</nom_dossier>
        <flux>
            <nom_flux>OpenRSS</nom_flux>
            <url>http://www.geocities.com/nolius123/openrss.xml</url>
         </flux>
    </dossier>
     <dossier>
       <nom_dossier>Actualités</nom_dossier>
      <flux>
            <nom_flux>Google Actualités France - France</nom_flux>
            <url>http://hyperlinkextractor.free.fr/rssfiles/google_france.xml</url>
      </flux>
      <flux>
            <nom_flux>Google Actualités France - International</nom_flux>
            <url>http://hyperlinkextractor.free.fr/rssfiles/google_monde.xml</url>
      </flux>
   </dossier>
   <dossier>
      <nom_dossier>Informatique</nom_dossier>
      <flux>
            <nom_flux>Actualités ZDNet.fr</nom_flux>
            <url>http://www.zdnet.fr/feeds/rss/actualites/</url>
      </flux>
      <flux>
            <nom_flux>codes-sources.com - dernieres sources</nom_flux>
            <url>http://www.codes-sources.com/rss.aspx?type=code</url>
      </flux>
      <flux>
            <nom_flux>Infos-du-Net.com</nom_flux>
            <url>http://www.infos-du-net.com/backend.php</url>
      </flux>
      <flux>
            <nom_flux>dotnetguru.org</nom_flux>
            <url>http://www.dotnetguru.org/backend.php</url>
      </flux>
   </dossier>
   <dossier>
      <nom_dossier>Jeux video</nom_dossier>
      <flux>
            <nom_flux>Actu PC Jeux video</nom_flux>
            <url>http://actupcjv.webdynamit.net/PHP-Nuke-6.9.1/html/backend.php</url>
      </flux>
      <flux>
            <nom_flux>Gamekult.com</nom_flux>
            <url>http://www0.gamekult.com/cobranding/rss/news.xml</url>
      </flux>
   </dossier>
</donnees>

Il faut donc parser le flux, pour ajouter les divers éléments aux noeuds du TreeView. Pour cela, utilisons l'espace de noms System.Xml

Code du parsing

Déclarations:

private TreeNode tnd_racine;
private TreeNode tnd_dossiers;
private XmlTextReader lecturexml;

Nettoyage du treeview, et initialisation du parser :

this.tvw_browser.Nodes.Clear();
//Parse le document interne au programme (dossier, noms flux, url)
lecturexml = newXmlTextReader("fichier_donnees.xml");

La suite du code est incluse dans un bloc try/catch, afin de capturer l'exception dans le cas ou le fichier XML ne serait pas présent.
On commence par les ruptures pour construire le TreeView:

try
{
    XmlDocumentdoc = newXmlDocument();
    doc.Load(lecturexml);

    XmlNodenoeud_racine = doc.DocumentElement;
    XmlNodenoeud_dossier = doc.DocumentElement;
    XmlNodenoeud_contenudossier = doc.DocumentElement;
    XmlNodenoeud_flux = doc.DocumentElement;

    if(noeud_racine.Name == "donnees") //Sinon le document xml est incorrect
    {
        noeud_dossier = noeud_racine.FirstChild; //dossiers
        tnd_racine = newTreeNode("Flux enregistrés");

        while(noeud_dossier != null)
        {
            noeud_contenudossier = noeud_dossier.FirstChild;//nom dossier, et flux
            while(noeud_contenudossier != null)
            {
                #regiondossier
                if(noeud_contenudossier.Name == "nom_dossier")
                {
                    tnd_dossiers = newTreeNode(noeud_contenudossier.InnerText);
                }
                elseif(noeud_contenudossier.Name == "flux")
                {
                    #regionflux
                    noeud_flux = noeud_contenudossier.FirstChild;//nom_flux
                    while(noeud_flux != null)
                    {
                        tnd_dossiers.Nodes.Add(noeud_flux.InnerText);
                        noeud_flux = noeud_flux.NextSibling;
                    }
                    #endregion
                }
                noeud_contenudossier = noeud_contenudossier.NextSibling;
                #endregion
            }
            tnd_racine.Nodes.Add(tnd_dossiers);
            noeud_dossier = noeud_dossier.NextSibling;
        }
    }
    //Fermeture du fichier XML
    lecturexml.Close();

    //Chargement treeview
    this.tvw_browser.Nodes.Add(tnd_racine);
    tvw_browser.Nodes[0].Expand();
}
catch
{
    MessageBox.Show("Fichier d'archivage introuvable", "Gestion des flux", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}

Pour l'instant les attributs du flux sont affichés en totalité (nom et url), ne s'agissant ici que d'une base de travail.

Ce document intitulé « Chargement d'un fichier XML dans un TreeView » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous