IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Tri d'un XML


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1
    Par défaut Tri d'un XML
    Bonjour à tous,

    Je me retrouve coincé sur un petit point, j'ai aujourd'hui un fichier xml de ce type :
    <doc dt="decembre">
    <...> ... </...>
    </doc>

    <doc dt="janvier">
    <...> ... </...>
    </doc>

    <doc dt="decembre">
    <...> ... </...>
    </doc>

    <doc dt="avril">
    <...> ... </...>
    </doc>

    <doc dt="decembre">
    <...> ... </...>
    </doc>
    Je parse le fichier xml, récupère dans ma classe les informations m'occupe de l'affichage derrière.
    Le problème que j'ai maintenant est que mon affichage se fais dans l'ordre du parsing.
    Je peux donc me retrouver avec des informations du mois de décembre puis avril puis janvier dans un ordre qui n'est pas logique.
    Ma question est ce qu'il y a un moyen pour créer un nouveau fichier XML (ça je sais que oui ^^) mais en remodelant par un tri dans un ordre que je définis.
    Dans l'idée je pensais à quelque chose comme une List ou autre [Janvier, Fevrirer, ... ,] et le nouveau fichier XML aura bien tout les janvier en premier , puis en second février , ainsi de suite.
    Est-ce possible ?

    Voilà, j'espère d'abord avoir était assez claire, puis j'espère que quelqu'un à une petite idée/ solution

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Par défaut
    Salut,
    tu as le code qui permet la lecture du fichier xml et un petit bout du fichier ?
    Ça ne semble pas compliqué mais bon à pondre comme ça sans rien ^^

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 95
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Par défaut
    Citation Envoyé par Federer_Fly Voir le message
    Bonjour à tous,

    Je me retrouve coincé sur un petit point, j'ai aujourd'hui un fichier xml de ce type :


    Je parse le fichier xml, récupère dans ma classe les informations m'occupe de l'affichage derrière.
    Le problème que j'ai maintenant est que mon affichage se fais dans l'ordre du parsing.
    Je peux donc me retrouver avec des informations du mois de décembre puis avril puis janvier dans un ordre qui n'est pas logique.
    Ma question est ce qu'il y a un moyen pour créer un nouveau fichier XML (ça je sais que oui ^^) mais en remodelant par un tri dans un ordre que je définis.
    Dans l'idée je pensais à quelque chose comme une List ou autre [Janvier, Fevrirer, ... ,] et le nouveau fichier XML aura bien tout les janvier en premier , puis en second février , ainsi de suite.
    Est-ce possible ?

    Voilà, j'espère d'abord avoir était assez claire, puis j'espère que quelqu'un à une petite idée/ solution

    Oui, ne l'utilisant pas fréquemment, la réponse sera conditionnelle : alors peut-être qu'une expression unique XPATH peut réaliser ce que tu souhaites ou bien et la j'en suis quasi certain : utiliser XSLT. Le XSLT est une feuille de style qui permet de réaliser des transformations ayant pour source un fichier XML.
    Regarde sur msdn, il y a de multiples exemples sur le sujet.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Si la version de ton Framework.NET est au moins 3.5, alors tu peux utiliser Linq To XML pour réordonner tes nœuds.

    Après, dans ton cas, cela va nécessiter déjà que tu spécifies l'ordre que doivent avoir tes différentes valeurs "janvier", "decembre", etc... car le Framework ne les connait pas nativement sous cette forme.

    Ce que moi j'aurais fait dans ce cas, c'est de les mettre dans un tableau tout bête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string[] orderMois = { "janvier", "fevrier", "mars", "avril", "mai", "juin", "juillet", "aout", "septembre", "octobre", "novembre", "decembre" };
    et là je sais que je pourrais savoir leur numéro d'ordre en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array.IndexOf(orderMois, monMois)
    où "monMois" est la chaine de caractère du mois dont on veut connaître l'ordre.

    Pour charger le document qui est dans un fichier avec les objets Linq To XML on peut faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Chargement du document
    XDocument doc = XDocument.Load(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "XMLTest.xml"));
    Alors là j'ai ouvert en fait un document "XMLTest.xml" qui était sur mon bureau pour le test. Tu remplaceras l'argument de "XDocument.Load" par le chemin de ton fichier XML bien sûr.

    Ensuite, pour la requête on peut faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //Requête Linq
    IEnumerable<XElement> requete = from elt in doc.Root.Elements("doc")
                                 orderby Array.IndexOf(orderMois, elt.Attribute("dt").Value)
                                 select elt;
    Une forme plus courte serais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IEnumerable<XElement> requete = doc.Root.Elements("doc")
    	.OrderBy(elt => Array.IndexOf(orderMois, elt.Attribute("dt").Value));
    Enfin bred ce sont 2 formes différentes qui font la même chose : ça prend les éléments "doc" (j'ai supposé qu'ils étaient directement sous la racine XML) et ça les ordonne donc par l'index du mois (donné par le tableau décrit plus haut, je le rappelle).

    Une fois que tu as fais ta requête ainsi, il n'y a plus qu'à parcourir les éléments de type "XElement" (je te laisserai regarder la doc MSDN sur les objets "XElement", "XAttribute", "XDocument") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach (XElement elt in requete)
    {
          //Les éléments sont énumérés dans l'ordre spécifiés par la requête Linq. Il y aura bien d'abord "janvier" puis "fevrier", etc...
    }
    Avec Linq, ça ressemble beaucoup à du SQL notamment sur le fait que tu peux aussi demander des tris secondaires, et même faire des regroupements si tu en a envie! C'est pas mal, non?

Discussions similaires

  1. Tri de noeud XML
    Par wil4linux dans le forum Linq
    Réponses: 2
    Dernier message: 28/05/2009, 09h56
  2. Fonction de tri du resultat XML
    Par alain31tl dans le forum Flex
    Réponses: 4
    Dernier message: 02/04/2009, 14h27
  3. [XSLT] Regroupement et tri d'un XML selon un attribut
    Par tatemilio2 dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 25/01/2007, 11h18
  4. [DOM XML] Tri XML avec php 4
    Par -Ju- dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 01/02/2006, 18h07
  5. [ XML ][ XSL ] tri par date
    Par zozolh2 dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/08/2004, 10h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo