Recherche dans un fichier XML

Résolu
quentin22breizh Messages postés 34 Date d'inscription mercredi 30 juillet 2014 Statut Membre Dernière intervention 27 avril 2017 - 11 août 2015 à 14:11
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 - 18 oct. 2015 à 12:25
Bonjour,

Je me permets de venir vers vous pour un petit souci que je rencontre actuellement. J'ai un fichier XML répertoriant une liste d'adhérents et je souhaiterai ajouter une fonction de recherche en fonction du nom et du prénom de la personne.

A partir d'une Textbox, l'utilisateur saisis le nom et le prénom de la personne recherché et je parcours ma fichier à la recherche de la personne.

Voici la structure du fichier:

<?xml version="1.0" encoding="UTF-8"?>

<!--XML Database.-->

-<Liste_Adhérents>


-<Adherents>

<Nom>Morisse</Nom>

<Prenom>Quentin</Prenom>

<Age>27</Age>

</Adherents>

-<Adherents>

<Nom>Toto</Nom>

<Prenom>Tintin</Prenom>

<Age>27</Age>

</Adherents>

</Liste_Adhérents>


Merci d'avance de votre aide

10 réponses

quentin22breizh Messages postés 34 Date d'inscription mercredi 30 juillet 2014 Statut Membre Dernière intervention 27 avril 2017
11 août 2015 à 14:42
Pour faciliter la compréhension de mon problème, je vous joins mon code:
Dim document As XmlReader = New XmlTextReader("ListeAdhérents" & Year(Date.Today) & ".xml".ToString())
While (document.Read())
Dim type = document.NodeType
If (type = XmlNodeType.Element) Then
If (document.Name = "Nom") Then
If StrComp(document.ReadInnerXml.ToString(), NomAdherentRechercher.Text.ToString()) = 0 Then
MessageBox.Show("Le nom de l'adhérent a été trouvé")
If (document.Name = "Prénom") Then
If StrComp(document.ReadInnerXml.ToString(), PrenomAdherentRechercher.Text.ToString()) = 0 Then
MessageBox.Show("L'adhérent a été trouvé")
Else
MessageBox.Show("L'adhérent n'existe pas. Vérifiez l'orthographe et essayez à nouveau bibi")
End If
End If
Else
MessageBox.Show("L'adhérent n'existe pas. Vérifiez l'orthographe et essayez à nouveau")
End If
End If
End If
End While


La partie comparaison du nom fonctionne mais bloque ensuite pour la partie prénom donc je dois faire une mauvaise manip mais où?
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
11 août 2015 à 18:32
Bonjour, le plus simple est de charger tout ton fichier dans une List(of) en ayant au préalable écrit une classe Adhérent.

C'est sur cette liste que tu effectueras et suites tes recherches.
Ensuite tu peux enregistrer le fichier soit de façon régulière, soit à chaque modification.
0
quentin22breizh Messages postés 34 Date d'inscription mercredi 30 juillet 2014 Statut Membre Dernière intervention 27 avril 2017
12 août 2015 à 00:45
Bonsoir Whishmeril et merci de ta réponse. Pourrai tu être un peu plus explicite (Petit bout de code). Je comprends l'idée mais étant débutant dans le milieu, j'avoue avoir du mal à savoir comment gérer la chose.

Merci d'avance de ton aide
0
quentin22breizh Messages postés 34 Date d'inscription mercredi 30 juillet 2014 Statut Membre Dernière intervention 27 avril 2017
12 août 2015 à 01:01
Bon en faisant quelques recherches, je pensais définir ma classe comme suis:

Public Class Adherent
Public nom As String
Public prenom As String
Public Age As Integer
End Class


Mais pour la suite la gestion de la classe....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
Modifié par Whismeril le 12/08/2015 à 14:01
Bonjour,

pour la classe il est conseillé d'utiliser des propriétés plutôt que des variables publiques.

Voici un exemple avec Linq to Xml
http://codes-sources.commentcamarche.net/forum/affich-10041677-modifier-des-donnees-dans-une-ligne-datagridview#6

Stocker l'age n'est pas judicieux, chaque année tu devras tout mettre à jour. Il vaut mieux stocker la date de naissance et utiliser une propriété en lecture seule qui calcul l'age.



Modérer m'amène à intervenir dans de nombreux posts, mais les seuls langages que je connaisses sont le C# et un peu de VB. Pour vos codes pensez à la coloration.
Réponse trouvée ->Question Résolue
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
7 oct. 2015 à 20:34
Bonsoir,
ou en es tu?

J'ai pris le temps, enfin, d'écrire un tuto sur Linq To Xml
http://codes-sources.commentcamarche.net/faq/11196-linq-to-xml-c-et-vb-net#serialisation

Si ça peut aider.
0
quentin22breizh Messages postés 34 Date d'inscription mercredi 30 juillet 2014 Statut Membre Dernière intervention 27 avril 2017
15 oct. 2015 à 09:40
Bonjour Wishmeril,

Désolé pour le temps de réponse. Ce projet est un projet "perso" et j'avais plein de boulot. Oui j'ai réussi à arriver à mes fins;Non s'en mal mais le résultat est là. Je partage mon code au cas où il puisse servir à quelqu'un:


Dim xmldoc As XmlDocument = New XmlDocument
Dim Adherent_trouve As Boolean = False
xmldoc.Load("ListeAdhérents" & Year(Date.Today) & ".xml".ToString())
'On récupère tous les noeuds personnes
'à l'intérieur d'un noeud personnes
For Each personneElement In xmldoc.SelectNodes("/Liste_Adhérents/Adherents")
'On récupère les informations sur la personne
If StrComp(personneElement.SelectSingleNode("Nom").InnerText, NomAdherentRechercher.Text.ToString()) = 0 Then
If StrComp(personneElement.SelectSingleNode("Prenom").InnerText, PrenomAdherentRechercher.Text.ToString()) = 0 Then
Adherent_trouve = True
'Si on trouve l'adhérent dans la liste, on charge les données puis on ouvre la page de visualisation
Visualisation_adherent.NomAdherentVisu.Text = personneElement.SelectSingleNode("Nom").InnerText
Visualisation_adherent.PrenomAdherentVisu.Text = personneElement.SelectSingleNode("Prenom").InnerText
Visualisation_adherent.AgeAdherentVisu.Text = personneElement.SelectSingleNode("Age").InnerText
Visualisation_adherent.AdresseAdherentVisu.Text = personneElement.SelectSingleNode("Adresse").InnerText
Visualisation_adherent.CodePostalAdherentVisu.Text = personneElement.SelectSingleNode("CodePostal").InnerText
Visualisation_adherent.VilleAdherentVisu.Text = personneElement.SelectSingleNode("Ville").InnerText
Visualisation_adherent.TelephoneAdherentVisu.Text = personneElement.SelectSingleNode("Telephone").InnerText
Visualisation_adherent.EmailAdherentVisu.Text = personneElement.SelectSingleNode("Email").InnerText
Visualisation_adherent.JourNaissanceAdherentVisu.Text = personneElement.SelectSingleNode("JourNaissance").InnerText
Visualisation_adherent.MoisNaissanceAdherentVisu.Text = personneElement.SelectSingleNode("MoisNaissance").InnerText
Visualisation_adherent.AnneeNaissanceAdherentVisu.Text = personneElement.SelectSingleNode("AnnéeNaissance").InnerText
Visualisation_adherent.PremiereAnneChasseAdherentVisu.Text = personneElement.SelectSingleNode("PremiereAnnéeChasse").InnerText
If StrComp(personneElement.SelectSingleNode("VenerieSousTerre").InnerText, "OUI") = 0 Then
Visualisation_adherent.AdherentVisuPratiqueVenerieSousTerre.Visible = True
End If
If StrComp(personneElement.SelectSingleNode("GrandeVenerie").InnerText, "OUI") = 0 Then
Visualisation_adherent.AdherentVisuPratiqueGrandeVenerie.Visible = True
Else
Visualisation_adherent.AdherentVisuPratiqueGrandeVenerie.Visible = False
End If
If StrComp(personneElement.SelectSingleNode("ChasseChienArret").InnerText, "OUI") = 0 Then
Visualisation_adherent.AdherentVisuPratiqueChasseChienArret.Visible = True
End If
If StrComp(personneElement.SelectSingleNode("ChasseChienCourant").InnerText, "OUI") = 0 Then
Visualisation_adherent.AdherentVisuPratiqueChasseChienCourant.Visible = True
End If
If StrComp(personneElement.SelectSingleNode("ChasseSansChien").InnerText, "OUI") = 0 Then
Visualisation_adherent.AdherentVisuPratiqueChasseSansChien.Visible = True
End If
If StrComp(personneElement.SelectSingleNode("Cotisation").InnerText, "OUI") = 0 Then
Visualisation_adherent.AdherentVisuCotisationPaye.Visible = True
Visualisation_adherent.AdherentVisuCotisationNonPaye.Visible = False
Else
Visualisation_adherent.AdherentVisuCotisationPaye.Visible = False
Visualisation_adherent.AdherentVisuCotisationNonPaye.Visible = True
End If
Visualisation_adherent.Show()
Me.Close()
Exit For
End If
End If
Next
If Not Adherent_trouve Then
MessageBox.Show("L'adhérent rechercher n'a pas été trouvé. Veuillez vérifier l'orthographe et essayer à nouveau")
End If
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
16 oct. 2015 à 20:29
Bonsoir.

Tu peux poster un ou deux enregistrement de faux adhérents, je pense qu'on peu largement optimiser.
0
quentin22breizh Messages postés 34 Date d'inscription mercredi 30 juillet 2014 Statut Membre Dernière intervention 27 avril 2017
17 oct. 2015 à 14:47
Salut Wishmeril,

Voici un exemple:
<?xml version="1.0" encoding="UTF-8"?>

<!--XML Database.-->

-<Liste_Adhérents>


-<Adherents>

<Nom>Dupont</Nom>

<Prenom>Jean-Marc</Prenom>

<Age>57</Age>

<Adresse>Chez moi</Adresse>

<CodePostal>22180</CodePostal>

<Ville>Je sais plus</Ville>

<Telephone>0607080910</Telephone>

<Email>j'en ai pas</Email>

<JourNaissance>10</JourNaissance>

<MoisNaissance>Mars</MoisNaissance>

<AnnéeNaissance>1968</AnnéeNaissance>

<PremiereAnnéeChasse>2014</PremiereAnnéeChasse>

<VenerieSousTerre>NON</VenerieSousTerre>

<GrandeVenerie>NON</GrandeVenerie>

<ChasseChienArret>NON</ChasseChienArret>

<ChasseChienCourant>NON</ChasseChienCourant>

<ChasseSansChien>OUI</ChasseSansChien>

<Cotisation>OUI</Cotisation>

</Adherents>

</Liste_Adhérents>
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
18 oct. 2015 à 11:36
Bonjour,

comme je te l'ai écrit plus haut, enregistrer l'age n'est pas utile quand tu as la date de naissance, puisque tu peux le calculer. Par contre c'est plus simple avec une date en chiffre, mais bon.

Un autre point évite les accents dans les balises, c'est comme pour les variables.

Je regarde ça et te propose un truc
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
18 oct. 2015 à 12:25
J'ai remplacé les "é" par des "e" dans le xml.

En appliquant la méthode que je propose dans le tuto.

Voici la classe
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq

Namespace Test_Winform
	Public Class AdherentChasse
		Public Sub New(ByVal E As XElement)
			Nom = E.Element("Nom").Value
			Prenom = E.Element("Prenom").Value
			Adresse = E.Element("Adresse").Value
			CodePostal = Convert.ToInt32(E.Element("CodePostal").Value)
			Ville = E.Element("Ville").Value
			Email = E.Element("Email").Value
			Telephone = Convert.ToInt32(E.Element("Telephone").Value)
			Dim jour As String = E.Element("JourNaissance").Value
			Dim moi As String = E.Element("MoisNaissance").Value
			Dim annee As String = E.Element("AnneeNaissance").Value
			Dim datenaiss As String = jour & " " & moi & " " & annee
			DateNaissance = Date.Parse(datenaiss)
			PremiereAnnne2Chasse = Convert.ToInt32(E.Element("PremiereAnneeChasse").Value)
			VenerieSousTerre = (E.Element("VenerieSousTerre").Value = "OUI")
			GrandeVenerie = (E.Element("GrandeVenerie").Value = "OUI")
			ChasseChienArret = (E.Element("ChasseChienArret").Value = "OUI")
			ChasseChienCourant = (E.Element("ChasseChienCourant").Value = "OUI")
			ChasseSansChien = (E.Element("ChasseSansChien").Value = "OUI")
			Cotisation = (E.Element("Cotisation").Value = "OUI")
		End Sub

		Public Property Nom() As String

		Public Property Prenom() As String

		Public Property Adresse() As String

		Public Property CodePostal() As Integer

		Public Property Ville() As String

		Public Property Email() As String

		Public Property Telephone() As Integer

		Public Property DateNaissance() As Date

		Public ReadOnly Property Age() As Integer
			Get
				Return Date.Now.Year - DateNaissance.Year
			End Get
		End Property

		Public Property PremiereAnnne2Chasse() As Integer

		Public Property VenerieSousTerre() As Boolean

		Public Property GrandeVenerie() As Boolean

		Public Property ChasseChienArret() As Boolean

		Public Property ChasseChienCourant() As Boolean

		Public Property ChasseSansChien() As Boolean

		Public Property Cotisation() As Boolean

		Public Shared Function ImportXml(ByVal CheminFichier As String) As List(Of AdherentChasse)
			Dim xdoc As XDocument = XDocument.Load(CheminFichier)

			Return (
			    From a In xdoc.Descendants("Adherents")
			    Select New AdherentChasse(a)).ToList()
		End Function

	End Class
End Namespace

Note que je calcule l'age donc je ne le lis pas.

Pour charger le fichier dans une liste
			Dim mesChasseurs As List(Of AdherentChasse) = AdherentChasse.ImportXml("quentin22breizh.xml")


Et pour la recherche
			Dim AdherentATrouver As AdherentChasse = mesChasseurs.SingleOrDefault(Function(a) a.Nom = "Dupont" AndAlso a.Prenom = "Jean")

			If AdherentATrouver Is Nothing Then
				MessageBox.Show("L'adhérent recherché n'existe pas.")
			End If


Le gros avantage d'avoir une collection d'objet, c'est que tu peux ensuite la binder à tout (ou presque) type de contrôle pour l'afficher. Voici un autre tuto ou j'en parle.
http://codes-sources.commentcamarche.net/faq/1291-utilisation-du-binding-au-travers-de-l-objet-databindingsource

Et ça marche aussi pour rendre visible ou non un contrôle en binant la propriété visible directement.
0
Rejoignez-nous