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 :

LinQ to XML - Fonction de recherche (balise dans une balise, dans une balise)


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 50
    Points : 37
    Points
    37
    Par défaut LinQ to XML - Fonction de recherche (balise dans une balise, dans une balise)
    Bonjour,


    Actuellement j'essaie de réaliser des fonctions de recherche dans un fichier XML avec Linq to XML. J'ai un fichier XML avec la structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <Root>
    	<Element1>
    		<Enregistrement>
    		<...></...>
    		</Enregistrement>
    	</Element1>
    	<C_LIEUXLIVRAISON>
    		<Enregistrement>
    		  <IDLIEULIVRAISON>1</IDLIEULIVRAISON>
    		  <NOMLIEULIVRAISON>Service technique</NOMLIEULIVRAISON>
    		  <NUMRUE>15</NUMRUE>
    		  <RUE>Rue machin</RUE>
    		</Enregistrement>
    		<Enregistrement>
    		  <IDLIEULIVRAISON>2</IDLIEULIVRAISON>
    		  <NOMLIEULIVRAISON>Mairie</NOMLIEULIVRAISON>
    		  <NUMRUE>2</NUMRUE>
    		  <RUE>Avenue truc</RUE>     
    		</Enregistrement>
    	</C_LIEUXLIVRAISON>
    	<Element2>
    		<Enregistrement>
    		<...></...>
    		</Enregistrement>
    	</Element2>
    </Root>
    En gros j'ai une suite d'élément contenant des Enregistrements, qui sont identifier par une balise ID. Ce que je souhaite c'est permettre à l'utilisateur de rechercher un Element par son ID.

    Actuellement j'ai cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    XNamespace ns = "urn:bdd-schema";
    XDocument xdoc = XDocument.Load(monfichierXml);
     
    XElement result = new XElement("Root", from el in xdoc.Descendants(ns + "C_LIEUXLIVRAISON")
                                                           where el.Element(ns + "IDLIEULIVRAISON").Value == "2"
                                                           select el
                                                           );
    Aujourd'hui j'ai une erreur qui se déclenche au niveau de la clause "where", ce qui est normal car je lui demande l'élément du nom IDLIEULIVRAISON juste en dessous de C_LIEUXLIVRAISON, or directement après ce dernier il n'y a que des balises Enregistrement.

    Je n'arrive pas à sélectionner une balise qui est dans une balise, dans une autre balise .
    J'ai pensé à faire quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    result = new XElement("Root", from el in xdoc.Descendants(ns + "C_LIEUXLIVRAISON")
                                                      where el.Name.LocalName.Equals("Enregistrement")
                                                      from el2 in el.Elements()
                                                      where el2.Element(ns + "IDLIEULIVRAISON").Value == "2"
                                                      select el2
                                                           );
    Mais il faut boucler sur l'élément Enregistrement et je n'y suis pas encore parvenu.

    edit : Comme c'est un peu fouillis ce que je dis, en fait je cherche à faire une requête qui me retourne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		<Enregistrement>
    		  <IDLIEULIVRAISON>2</IDLIEULIVRAISON>
    		  <NOMLIEULIVRAISON>Mairie</NOMLIEULIVRAISON>
    		  <NUMRUE>2</NUMRUE>
    		  <RUE>Avenue truc</RUE>  
    		</Enregistrement>
    Quelqu'un a une idée pour réaliser cette requête ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 671
    Points : 1 171
    Points
    1 171
    Par défaut
    Bonjour,
    à tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                IEnumerable<XElement> requete =
                    from d in xdoc.Root.Descendants("IDLIEULIVRAISON")
                    where d.Value == "2"
                    select new XElement(d.Parent);
                foreach (XElement el in requete)
                    {
                    Console.WriteLine(el);
                    }
    En ajoutant l'espace de noms XML si nécessaire.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 50
    Points : 37
    Points
    37
    Par défaut
    Merci ! J'ai testé ton code, donc en effet ça fonctionne très bien.
    Seul petit problème c'est que mon fichier XML représente une base de données, par conséquent le champs IDMachin sera présent dans la table Machin mais aussi en clé étrangère dans la table Truc... comme mes explication sont fumeuses voilà un fichier xml schématique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <Root>
    	<Table1>
    		<Enregistrement>
    			<IDTABLE1>1<IDTABLE1>
    			<NomTable1></NomTable1>			
    		</Enregistrement>
    	</Table1>
    	<Table2>
    		<Enregistrement>
    			<IDTABLE2><IDTABLE2>
    			<NomTable2></NomTable2>	
    			<IDTABLE1>1<IDTABLE1>		
    		</Enregistrement>
    	</Table2>
    </Root>
    Avec ton code je récupère tous les éléments contenant la balise <ID> égal à 2. Or je cherche à récupérer l'élément présent dans la table "Table1" contenant un "Enregistrement" contenant un élément IDTABLE1 égal à 1. Peut être que je dois m'y prendre en deux temps, je ne sais pas vraiment comment faire.



    EDIT :
    J'ai réussit en exécutant deux requêtes d'affilées en récupérant la tienne, peut être y a-t-il un moyen pour ne le faire qu'en une seule, si quelqu'un a une idée il est le bienvenu !
    Pour l'instant voilà comment je procède :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    XElement resulta = new XElement("Root",
                            from el in xdoc.Root.Elements()
                            where el.Name.LocalName.Equals("C_LIEUXLIVRAISON")
                            select el
                            );
     
    IEnumerable<XElement> requete =
                            from d in resulta.Descendants(ns + "IDLIEULIVRAISON")
                            where d.Value == "2"
    			select new XElement(d.Parent);
     
    foreach (XElement el in requete)
    {
    	Console.WriteLine(el);
    }

    Merci en tout cas pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Déplacer une image d'une feuille vers une autre dans un fichier Excel
    Par helenaide dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/10/2011, 14h27
  2. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  3. Réponses: 2
    Dernier message: 23/05/2010, 12h45
  4. Une image dans un Jpanel dans un Jpanel dans un Jframe
    Par ThomasH dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 09/12/2009, 20h23
  5. [2.0] Mettre une Checkbox dans le header d'une colonne d'une DatagridView
    Par aurelien.tournier dans le forum Windows Forms
    Réponses: 5
    Dernier message: 23/01/2007, 10h27

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