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 ?