none
Accéder aux donnée en mémoire d'un XmlDataProvider, depuis le code VB.net RRS feed

  • Question

  • Dans le cas d'un fichier XML "bindé" à des éléments de l'interface (WPF)

    Dim systemdata As XmlDataProvider = New XmlDataProvider()
    Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
            systemdata.Source = New Uri("fichier.xml")
            systemdata.XPath = "Base"
            Grid1.DataContext = systemdata
    End Sub

    Comment puis-je faire, svp, pour accéder à ces données (chargées en mémoire par le XmlDataProvider)...à partir du code VB.net?

    • Modifié jmdeb mardi 16 octobre 2012 19:06
    mardi 16 octobre 2012 19:06

Réponses

  • Voila donc ce qui a marché pour moi:

    Donc, pour pouvoir, à partir d'un même fichier, faire du binding (XmlDataProvider) et pouvoir y toucher par le code aussi (XmlDocument), voila la démarche:

    Public Shared Xmldoc As XmlDocument = New XmlDocument() 'Initialiser un nouveau XmlDocument
    Public Shared Xmlprov As XmlDataProvider = New XmlDataProvider() 'Faire de même pour un XmlDataProvider
    Sub xmlInit() 'Au chargement
            Xmldoc.Load("Systems.xml") 'Charger le XmlDocument avec un fichier .xml
            Xmlprov.Document = Xmldoc 'Dire ensuite au XmlDataProvider que son document sera..le XmlDocument
            Xmlprov.XPath = "Emulators" 'Spécifier au XmlDataProvider le XPath de départ
            Grid1.DataContext= Xmlprov 'Eventuellement indiquer à quel niveau se fera le binding (ici, au niveau d'une grille)
    End Sub

    Au niveau XAML, voici un exemple d'utilisation:
    <ListBox ItemsSource="{Binding XPath=System}" IsSynchronizedWithCurrentItem="True" /> 'Ce listbox afficherait donc les éléments repris sous le tag "System" (en partant du tag "Emulator" comme spécifié avant)

    Au niveau VB, voici un exemple d'utilisation:  
    Dim nodeSystem as XmlNodeList = Xmldoc.SelectNodes("Emulators/System") 'nodeSystem, va contenir l'ensemble des nodes compris dans Emulators > System.
    • Marqué comme réponse jmdeb jeudi 15 novembre 2012 15:10
    jeudi 15 novembre 2012 15:09

Toutes les réponses

  • Dans le cas d'un fichier XML "bindé" à des éléments de l'interface (WPF)

    Dim systemdata As XmlDataProvider = New XmlDataProvider()
    Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
            systemdata.Source = New Uri("fichier.xml")
            systemdata.XPath = "Base"
            Grid1.DataContext = systemdata
    End Sub

    Comment puis-je faire, svp, pour accéder à ces données (chargées en mémoire par le XmlDataProvider)...à partir du code VB.net?

    Bonjour,

    Vous pouvez le parcourir de cette manière :

            For Each nom As XmlNode In systemdata.Document.GetElementsByTagName("Nom") 'parcour chaque balise "Nom"
                MessageBox.Show(nom.Value) 'affiche le résultat
            Next

    Tout ce trouve dans systemdata.Document, possibilité de parcourir en utilisant les XPath, utiliser LINQ pour rechercher par requête, etc...

    A vous de voir ce que vous souhaitez faire.

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !


    • Modifié Lyamine mercredi 17 octobre 2012 08:21
    • Proposé comme réponse Aurel Bera jeudi 18 octobre 2012 08:20
    mercredi 17 octobre 2012 08:20
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,

    Aurel


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 18 octobre 2012 07:00
  • Lyamine,

    Tout d'abord, merci pour ta réponse!
    Je dois manquer quelque chose, car je viens de réaliser l'exemple suivant...et cela ne fonctionne pas:

    Le fichier XML:

    <Books>
    	<Book ID="1" Name="ABC" />
    	<Book ID="2" Name="DEF" />
    	<Book ID="3" Name="XYZ" />
    </Books>

    Le code XAML:

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        Title="MainWindow" Height="350" Width="525">
        <Grid Name="Grid1">
        <ComboBox ItemsSource="{Binding XPath=Book/@Name}" IsSynchronizedWithCurrentItem="True" Height="34" HorizontalAlignment="Left" Margin="38,56,0,0" Name="ComboBox1" VerticalAlignment="Top" Width="208" />
      </Grid>
    </Window>

    Le code VB:

    Imports System.Xml
    Class MainWindow
        Dim systemdata As XmlDataProvider = New XmlDataProvider()
        Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
            systemdata.Source = New Uri("book.xml")
            systemdata.XPath = "Books"
            Grid1.DataContext = systemdata
            '
            For Each nom As XmlNode In systemdata.Document.GetElementsByTagName("Book")
                MessageBox.Show(nom.Attributes("ID").Value)
            Next
            '
        End Sub
    End Class

    Le binding se déroule bien, je vois que mon combobox est bien lié...mais impossible d'accéder aux données dans la boucle!!

    (A first chance exception of type 'System.NullReferenceException' occurred in WpfApplication1.exe)


    • Modifié jmdeb jeudi 18 octobre 2012 10:31
    jeudi 18 octobre 2012 10:31
  • Lyamine,

    Tout d'abord, merci pour ta réponse!
    Je dois manquer quelque chose, car je viens de réaliser l'exemple suivant...et cela ne fonctionne pas:

    Le fichier XML:

    <Books>
    	<Book ID="1" Name="ABC" />
    	<Book ID="2" Name="DEF" />
    	<Book ID="3" Name="XYZ" />
    </Books>

    Le code XAML:

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        Title="MainWindow" Height="350" Width="525">
        <Grid Name="Grid1">
        <ComboBox ItemsSource="{Binding XPath=Book/@Name}" IsSynchronizedWithCurrentItem="True" Height="34" HorizontalAlignment="Left" Margin="38,56,0,0" Name="ComboBox1" VerticalAlignment="Top" Width="208" />
      </Grid>
    </Window>

    Le code VB:

    Imports System.Xml
    Class MainWindow
        Dim systemdata As XmlDataProvider = New XmlDataProvider()
        Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
            systemdata.Source = New Uri("book.xml")
            systemdata.XPath = "Books"
            Grid1.DataContext = systemdata
            '
            For Each nom As XmlNode In systemdata.Document.GetElementsByTagName("Book")
                MessageBox.Show(nom.Attributes("ID").Value)
            Next
            '
        End Sub
    End Class

    Le binding se déroule bien, je vois que mon combobox est bien lié...mais impossible d'accéder aux données dans la boucle!!

    (A first chance exception of type 'System.NullReferenceException' occurred in WpfApplication1.exe)


    Bonjour

    je crois que le problème provient de votre systemdata.XPath = "Books". Supprimez cette ligne pour voir. Dans votre binding vous utilisez xpath "Book" donc il récupère tous les nodes Book. Si vous faites un parcoure par TagName pas besoin de XPath = "Books" dans votre code.


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    jeudi 18 octobre 2012 12:21
  • Malheureusement...ça ne marche pas mieux!!
    jeudi 18 octobre 2012 12:58
  • Malheureusement...ça ne marche pas mieux!!

    A quelle niveau s'arrête le débogueur quand il affiche NullReferenceException ?

    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    jeudi 18 octobre 2012 14:09
  • OK,

    j'ai trouvé un tuto sur le net http://www.jimmycollins.org/blog/?p=414

    testé et il fonctionne voici le code XAML :

    <Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid Name="Grid1"> <Grid.Resources> <XmlDataProvider x:Key="bookXml" Source="book.xml" XPath="Books" /> </Grid.Resources> <ComboBox ItemsSource="{Binding Source={StaticResource bookXml}, XPath=./Book}" DisplayMemberPath="@Name" SelectedValuePath="@ID" IsSynchronizedWithCurrentItem="True" Height="34" HorizontalAlignment="Left" Margin="38,56,0,0" Name="ComboBox1" VerticalAlignment="Top" Width="208" />

    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="98,141,0,0" Name="Button1" VerticalAlignment="Top" Width="75" /> </Grid> </Window>


    Il faut ajouter une ressource statique, faire un bind et choisir les attributs à afficher et la valeur...

    Maintenant si vous souhaitez parcourir les tag par code :

        Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
            Dim bookXml As XmlDataProvider = DirectCast(Grid1.Resources("bookXml"), XmlDataProvider)
            For Each nom As XmlNode In bookXml.Document.GetElementsByTagName("Book")
                MessageBox.Show(nom.Attributes("ID").Value)
            Next
        End Sub

    Voilà je pense avoir fait le tour. Par ailleurs si vous souhaitez avoir l'élément choisit dans le combobox, il faut utiliser l'événement SelectionChanged ou utiliser Binding mais je pense qu'un expert WPF devrait vous guider mieux que moi.

     

    Est-ce que sa répond à votre demande ?


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !


    • Modifié Lyamine jeudi 18 octobre 2012 15:01
    • Proposé comme réponse Lyamine jeudi 18 octobre 2012 15:18
    • Marqué comme réponse Aurel Bera vendredi 19 octobre 2012 12:04
    • Non marqué comme réponse jmdeb jeudi 15 novembre 2012 15:10
    jeudi 18 octobre 2012 15:01
  • Bonjour,

    Pouvons-nous considérer que vous avez résolu votre problème avec les scénarios proposés ? Dans l'affirmative, pourriez-vous partager avec nous la solution, afin que d'autres personnes avec le même problème puissent profiter de cette solution ?

    Désormais, nous marquons les solutions proposées. N'hésitez pas à revenir et supprimer la réponse marquée si la solution n’est pas correcte. Merci !

    Cordialement,

    Aurel


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    vendredi 19 octobre 2012 12:05
  • Voila donc ce qui a marché pour moi:

    Donc, pour pouvoir, à partir d'un même fichier, faire du binding (XmlDataProvider) et pouvoir y toucher par le code aussi (XmlDocument), voila la démarche:

    Public Shared Xmldoc As XmlDocument = New XmlDocument() 'Initialiser un nouveau XmlDocument
    Public Shared Xmlprov As XmlDataProvider = New XmlDataProvider() 'Faire de même pour un XmlDataProvider
    Sub xmlInit() 'Au chargement
            Xmldoc.Load("Systems.xml") 'Charger le XmlDocument avec un fichier .xml
            Xmlprov.Document = Xmldoc 'Dire ensuite au XmlDataProvider que son document sera..le XmlDocument
            Xmlprov.XPath = "Emulators" 'Spécifier au XmlDataProvider le XPath de départ
            Grid1.DataContext= Xmlprov 'Eventuellement indiquer à quel niveau se fera le binding (ici, au niveau d'une grille)
    End Sub

    Au niveau XAML, voici un exemple d'utilisation:
    <ListBox ItemsSource="{Binding XPath=System}" IsSynchronizedWithCurrentItem="True" /> 'Ce listbox afficherait donc les éléments repris sous le tag "System" (en partant du tag "Emulator" comme spécifié avant)

    Au niveau VB, voici un exemple d'utilisation:  
    Dim nodeSystem as XmlNodeList = Xmldoc.SelectNodes("Emulators/System") 'nodeSystem, va contenir l'ensemble des nodes compris dans Emulators > System.
    • Marqué comme réponse jmdeb jeudi 15 novembre 2012 15:10
    jeudi 15 novembre 2012 15:09