none
Extrair dados XML para um combobox RRS feed

  • Pergunta

  • Olá,

    Gente, preciso extrair os valores de um arquivo xml:

    <?xml version="1.0" encoding="utf-16"?>
    <ListView>
        <Columns>
            <Column text="Descrição:" width="220" textAlign="Left" />
            <Column text="Host/FTP:" width="234" textAlign="Left" />
            <Column text="Usuário/Login:" width="130" textAlign="Left" />
            <Column text="Senha:" width="0" textAlign="Left" />
        </Columns>
        <Items>
            <item text="My Count">
                <subItem text="ftp.mysite.com/" />
                <subItem text="contato@mysite.com" />
                <subItem text="12345" />
                <subItem text="" />
            </item>
            <item text="My Count 2">
                <subItem text="ftp.mysite2.com/" />
                <subItem text="contato@mysite2.com" />
                <subItem text="12345" />
                <subItem text="" />
            </item>
        </Items>
    </ListView>

    Preciso extrair o nome dos itens, no caso "My Count" e "My Count 2" para um combobox e ao selecionar o item no combobox que em textbox separados fosses extraidos os subitens correspondentes.

    Ex.: Seleciono My Count 2 e no

    Textbox1 = ftp.mysite2.com/

    Textbox2 = contato@mysite2.com

    E assim por diante.

    Alguém pode me ajudar? Desde já agradeço.

    segunda-feira, 16 de maio de 2016 01:29

Respostas

  • Primeiro crie uma classe Modelo:

    Public Class Items
        Private _key As String
        Public Property Key() As String
            Get
                Return _key
            End Get
            Set(ByVal value As String)
                _key = value
            End Set
        End Property
        Private _items As IList(Of String)
        Public Property Items() As IList(Of String)
            Get
                Return _items
            End Get
            Set(ByVal value As IList(Of String))
                _items = value
            End Set
        End Property
    
    
        Public Sub New()
    
        End Sub
    
        Public Sub New(ByVal key As String, ByVal items As IList(Of String))
            _key = key
            _items = items
        End Sub
    
    End Class

    Depois disso no seu Form principal crie uma variavel assim:

    Dim ListItems As New List(Of Items)

    Agora para ler os itens desse XML pode-se usar o XDocument do Linq:

    Sub LerXml()
    	Dim xmlText As String = File.ReadAllText(".\Base.xml")
    	Dim results = (From c In XDocument.Parse(xmlText).Descendants("Items").Elements()
    				   Select New With
    					 {
    						.Name = c.Attribute("text").Value,
    						.Items = c.Elements("subItem").Attributes("text").Select(Function(a) a.Value).ToList()
    					 }).ToArray()
    
    	For Each result In results
    		ListItems.Add(New Items(result.Name, result.Items))
    	Next
    End Sub

    Agora coloque esse método na inicialização do seu Form:

    Public Class Form1
    
        Dim ListItems As New List(Of Items)
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            LerXml()

    Pronto agora você tem um dado tipado que é bem simples utilizar para carregar combos e valores:

    'Carregar o Combo
    ComboBox1.Items.AddRange(ListItems.Select(Function(a) a.Key).ToArray())

    Ao Selecionar o Combo posicionando na primeira linha faça assim para carregar 4 variaveis (ou TextBox)

    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    	If (ComboBox1.Items.Count > 0) Then
    		Dim strs As String() = ListItems.Where(Function(c) c.Key.Equals(ComboBox1.SelectedItem)).Select(Function(a) a.Items).FirstOrDefault().ToArray()
    		If (IsNothing(strs) = False) Then
    			TextBox1.Text = strs(0)
    			TextBox2.Text = strs(1)
    			TextBox3.Text = strs(2)
    			TextBox4.Text = strs(3)
    		End If
    
    	End If
    End Sub


    Fulvio C

    • Marcado como Resposta Eliseu5 segunda-feira, 16 de maio de 2016 17:58
    segunda-feira, 16 de maio de 2016 13:19

Todas as Respostas

  • No meu canal tenho um vídeo explicando como desserializar um XML em objetos

    Assim que desserializado, basta passar a array de objetos gerada como DataSource para a ComboBox

    segunda-feira, 16 de maio de 2016 01:57
  • Primeiro crie uma classe Modelo:

    Public Class Items
        Private _key As String
        Public Property Key() As String
            Get
                Return _key
            End Get
            Set(ByVal value As String)
                _key = value
            End Set
        End Property
        Private _items As IList(Of String)
        Public Property Items() As IList(Of String)
            Get
                Return _items
            End Get
            Set(ByVal value As IList(Of String))
                _items = value
            End Set
        End Property
    
    
        Public Sub New()
    
        End Sub
    
        Public Sub New(ByVal key As String, ByVal items As IList(Of String))
            _key = key
            _items = items
        End Sub
    
    End Class

    Depois disso no seu Form principal crie uma variavel assim:

    Dim ListItems As New List(Of Items)

    Agora para ler os itens desse XML pode-se usar o XDocument do Linq:

    Sub LerXml()
    	Dim xmlText As String = File.ReadAllText(".\Base.xml")
    	Dim results = (From c In XDocument.Parse(xmlText).Descendants("Items").Elements()
    				   Select New With
    					 {
    						.Name = c.Attribute("text").Value,
    						.Items = c.Elements("subItem").Attributes("text").Select(Function(a) a.Value).ToList()
    					 }).ToArray()
    
    	For Each result In results
    		ListItems.Add(New Items(result.Name, result.Items))
    	Next
    End Sub

    Agora coloque esse método na inicialização do seu Form:

    Public Class Form1
    
        Dim ListItems As New List(Of Items)
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            LerXml()

    Pronto agora você tem um dado tipado que é bem simples utilizar para carregar combos e valores:

    'Carregar o Combo
    ComboBox1.Items.AddRange(ListItems.Select(Function(a) a.Key).ToArray())

    Ao Selecionar o Combo posicionando na primeira linha faça assim para carregar 4 variaveis (ou TextBox)

    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    	If (ComboBox1.Items.Count > 0) Then
    		Dim strs As String() = ListItems.Where(Function(c) c.Key.Equals(ComboBox1.SelectedItem)).Select(Function(a) a.Items).FirstOrDefault().ToArray()
    		If (IsNothing(strs) = False) Then
    			TextBox1.Text = strs(0)
    			TextBox2.Text = strs(1)
    			TextBox3.Text = strs(2)
    			TextBox4.Text = strs(3)
    		End If
    
    	End If
    End Sub


    Fulvio C

    • Marcado como Resposta Eliseu5 segunda-feira, 16 de maio de 2016 17:58
    segunda-feira, 16 de maio de 2016 13:19
  • Olá Fulvio

    Obrigado por sua ajuda. Estou implementando mas gera um erro:

    segunda-feira, 16 de maio de 2016 17:53
  • Olá Kerplunk

    Obrigado pela ajuda. Vou dar uma olhada.

    segunda-feira, 16 de maio de 2016 17:54
  • Fulvio

    Faltava importar a dll.

    Show de bola, funcionou perfeitamente.

    Muito obrigado, você é 10. abç, Deus abençoe. :)

    segunda-feira, 16 de maio de 2016 17:58