Recherche dans un fichier XML [Résolu]

quentin22breizh 35 Messages postés mercredi 30 juillet 2014Date d'inscription 27 avril 2017 Dernière intervention - 11 août 2015 à 14:11 - Dernière réponse : Whismeril 12116 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 18 octobre 2018 Dernière intervention
- 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
Afficher la suite 

Votre réponse

11 réponses

quentin22breizh 35 Messages postés mercredi 30 juillet 2014Date d'inscription 27 avril 2017 Dernière intervention - 11 août 2015 à 14:42
0
Merci
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ù?
Commenter la réponse de quentin22breizh
Whismeril 12116 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 18 octobre 2018 Dernière intervention - 11 août 2015 à 18:32
0
Merci
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.
Commenter la réponse de Whismeril
quentin22breizh 35 Messages postés mercredi 30 juillet 2014Date d'inscription 27 avril 2017 Dernière intervention - 12 août 2015 à 00:45
0
Merci
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
Commenter la réponse de quentin22breizh
quentin22breizh 35 Messages postés mercredi 30 juillet 2014Date d'inscription 27 avril 2017 Dernière intervention - 12 août 2015 à 01:01
0
Merci
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....
Commenter la réponse de quentin22breizh
Whismeril 12116 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 18 octobre 2018 Dernière intervention - Modifié par Whismeril le 12/08/2015 à 14:01
0
Merci
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
Commenter la réponse de Whismeril
Whismeril 12116 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 18 octobre 2018 Dernière intervention - 7 oct. 2015 à 20:34
0
Merci
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.
Commenter la réponse de Whismeril
quentin22breizh 35 Messages postés mercredi 30 juillet 2014Date d'inscription 27 avril 2017 Dernière intervention - 15 oct. 2015 à 09:40
0
Merci
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
Commenter la réponse de quentin22breizh
Whismeril 12116 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 18 octobre 2018 Dernière intervention - 16 oct. 2015 à 20:29
0
Merci
Bonsoir.

Tu peux poster un ou deux enregistrement de faux adhérents, je pense qu'on peu largement optimiser.
Commenter la réponse de Whismeril
quentin22breizh 35 Messages postés mercredi 30 juillet 2014Date d'inscription 27 avril 2017 Dernière intervention - 17 oct. 2015 à 14:47
0
Merci
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>
Whismeril 12116 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 18 octobre 2018 Dernière intervention - 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
Commenter la réponse de quentin22breizh
Whismeril 12116 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 18 octobre 2018 Dernière intervention - 18 oct. 2015 à 12:25
0
Merci
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.
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.