Recherche dans un fichier xml en vb.net

cs_diego29 Messages postés 22 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 17 octobre 2007 - 11 juil. 2006 à 08:15
cs_saizonou Messages postés 21 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 26 avril 2012 - 28 août 2006 à 13:48
je souhaite faire une fonction qui fait une recherche dans un fichier xml d'un ou deux objets suivant un critère.
le problème est le suivant : la fonction trouve un certain nombre de noeuds dans le fichier xml (ceux du début en fait) mais pas tous.

voici mon code:





Sub Rechercher_Composants()

        Dim DocXml As New XmlDocument()
        Dim Noeud1, Noeud2 As XmlNode
        Dim Noeuds1, Noeuds2 As XmlNodeList
        Dim sCritere1, sCritere2 As String
        Dim s1, s2 As String
        Dim v2 As Char() = {"+"}

        DocXml.Load("composants.xml")
        s1 = CBO_1_3.Text
        s2 = CBO_2_3.Text
       
        sCritere1 = "//objet[caract='" & CBO_1_2.SelectedItem & " " & s1.TrimStart(v2) & " euros" & "']"
        sCritere2 = "//objet[caract='" & CBO_2_2.SelectedItem & " " & s2.TrimStart(v2) & " euros" & "']"
       
        Noeud1 = DocXml.SelectSingleNode(sCritere1)
        Noeuds1 = Noeud1.ChildNodes

        For Each Noeud1 In Noeuds1
            Select Case Noeud1.Name
                Case "nom"
                    TXT_RES_1.Text = Noeud1.InnerText & " :" & vbCrLf
                Case "necessaire"
                    TXT_RES_1.Text = TXT_RES_1.Text & Noeud1.InnerText
            End Select
        Next

        If CBO_2_3.SelectedItem <> String.Empty Then

            Noeud2 = DocXml.SelectSingleNode(sCritere2)
            Noeuds2 = Noeud2.ChildNodes

            For Each Noeud2 In Noeuds2
                Select Case Noeud2.Name
                    Case "nom"
                        TXT_RES_2.Text = Noeud2.InnerText & " :" & vbCrLf
                    Case "necessaire"
                        TXT_RES_2.Text = TXT_RES_2.Text & Noeud2.InnerText
                End Select
            Next
        End If

End Sub


peut être y a t il des fonctions XML en .NET qui permettent de résoudre le problème autrement je manque de doc sur le sujet.
merci si vous avez une idée.

6 réponses

cs_saizonou Messages postés 21 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 26 avril 2012 6
23 août 2006 à 11:01
Salut,


Sans voir ton fichier xml c'est un peu difficile mais ta recherche Xpath se fait avec un SelectSingleNode "SelectSingleNode(sCritere1) " donc tu ne récupères que le premier noeud trouvé correspondant à ce critère.
Pour avoir une liste de tous les noeuds correspondants (nodelist) tu dois utiliser un SelectNode






SAIZONOU Landry
0
cs_diego29 Messages postés 22 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 17 octobre 2007
24 août 2006 à 10:56
mon fichier xml a la sctructure suivante :


<liste>
   <objet>   
      <nom></nom>
      

      <caract></caract>
      <necessaire>
         <compo0></comp0>
         <compo1></comp1>
         <compo2></comp2>
      </necessaire>
   </objet>
   <objet>
    ---------
   </objet>
</liste>

La recherche fonctionne en fait sur les 100 premiers objets à partir du 101 ème j'ai une erreur de type "System.NullReferenceException"


 


 
0
cs_diego29 Messages postés 22 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 17 octobre 2007
24 août 2006 à 17:10
c'est bien
<compo0></compo0>
<compo1></compo1>
<compo2></compo2>

petite erreur de frappe dans le msg au dessus
0
cs_saizonou Messages postés 21 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 26 avril 2012 6
25 août 2006 à 10:56
Salut
Ton erreur "System.NullReferenceException" vient du fait qu'une de tes recherches (
Noeud1 = DocXml.SelectSingleNode(sCritere1)
)ne trouve aucun node correspondant, tu te retrouves avec un Noeud1 nul.
Comme tu veux utiliser ce node après il te renvoi une erreur.
Pour éviter cette erreur tu dois effectuer le traitement sur ce node que s'il n'est pas nul :

Noeud1 = DocXml.SelectSingleNode(sCritere1)

If
Not Noeud1
Is
Nothing
Then
   Noeuds1 = Noeud1.ChildNodes

   For
Each Noeud1
In Noeuds1

      Select
Case Noeud1.Name

         Case
"nom"
            TXT_RES_1.Text = Noeud1.InnerText &
" :" & vbCrLf

         Case
"necessaire"
            TXT_RES_1.Text = TXT_RES_1.Text & Noeud1.InnerText

      End
Select
   Next
End
If

Je te rappel aussi que l'utilisation de SelectSingleNode ne retourne que le premier node correspondant à ta recherche, s'il y en a d'autres tu ne les auras pas dans ta réponse.

SAIZONOU Landry
http://www.saizonou.info
0

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

Posez votre question
cs_diego29 Messages postés 22 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 17 octobre 2007
28 août 2006 à 12:27
merci pour ces explications, en effet  SelectSingleNode ne retourne qu'un seul noeud mais comme il ne peut y avoir qu'un seul objet correspondant au critère dans ma liste je n'en aurai donc qu'un  mais effectivement pour etre plus rigoureux je devrai remplacer le // par / dans ma requete Xpath.

quant au test "ifnot" le compilateur me répond que le test n'est pas possible sur un objet de type XmlNodelist.


j'ai vérifié ma requete Xpath avec un outil Xpathvisualizer et tous les objets que j'ai pu rechercher ont été trouvés. dont pas de soucis du coté de la structure de mon fichier Xml.

j'ai essayé également avec un fichier XML avec une liste plus courte là bizarrement plus d'erreur !!

étant donné que je travaille avec une version Express de VB j'ai lu qu'il y avait une limitation quant au fonctionnalités Xml par rapport aux versions standard et pro le problème pourrait-il venir de là ?


 


 


 


 
0
cs_saizonou Messages postés 21 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 26 avril 2012 6
28 août 2006 à 13:48
Houps !
Petite erreur de frappe, c'est Is not et pas ifnot qui n'existe pas.
Quant à une limitation des fonctionnalités XML je ne sais pas ce qu'il en est, par contre l'erreur que tu annonces est bien une référence à un objet null.

SAIZONOU Landry
0
Rejoignez-nous