Import oraz eksport do/z pliku XML w VB

Jak wykonać import oraz eksport do/z pliku XML w VB? Przedstawiam w jaki sposób wykonać import z pliku XML do DataGridView, do poszczególnych textboxów oraz eksport danych do pliku XML

UWAGA! Ten post został zamieszczony na mojej starej stronie, która dawno temu padła. Archiwizuje stare artykuły których nie zweryfikowałem, może kiedyś się przydadzą – proszę z rezerwą podchodzić do treści tu zwartych.

Import zawartości XML do DataGridView przez OpenFileDialog:
  • Wartości do DataGridView dodawane są pojedynczo, jeżeli zrobimy DataSource to wtedy nie będziemy mogli modyfikować DataGridView, czyli dodawać i usuwać pozycji.
  • Nazwy nodów w pliku XML są dziwne, ale takie zostały stworzone w trakcie zapisu danych z DataGridView do pliku XML.

Źródło:
http://vb.net-informations.com/xml/vb.net-xml-to-DataGridView.htm
http://www.sourcehints.com/articles/how-to-load-xml-to-datagridview.html

Private Sub ImportZapisanychGrzejnikówToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ImportZapisanychGrzejnikówToolStripMenuItem.Click
        ' Import wcześniej zapisanego pliku XML
        ' z danymi z DataGridView.
        ' Kod z neta:
        ' http://vb.net-informations.com/xml/vb.net-xml-to-DataGridView.htm
        ' http://www.sourcehints.com/articles/how-to-load-xml-to-datagridview.html

        Dim XMLfilePath As String
        Dim OpenDLG As New OpenFileDialog
        ' Dim xmlFile As XmlReader
        ' Dim TempDGV As New DataGridView
        ' Dim LicznikTempDGV As Long
        Dim xmlDoc As New XmlDocument()
        Dim pName As String = ""

        '  Dim RowsCounter As Long = dgvListaZamowionychGrzejnikow.rows.

        ' Filtr dla OpenFileDialog
        ' Tylko XML i wszystkie pliki
        OpenDLG.Filter = "Pliki XML (*.xml)|*.xml|Wszystkie pliki (*.*)|*.*"
        OpenDLG.FilterIndex = 1
        OpenDLG.Multiselect = False
        OpenDLG.Title = "Wybierz plik XML..."

        ' Próba importu DataGridView z zapisanymi wcześniej grzejnikami
        Try

            ' Otwieranie okna do wskazania pliku XML do zaimportowania
            If OpenDLG.ShowDialog() = DialogResult.OK Then
                XMLfilePath = OpenDLG.FileName ' ścieka do pliku XML

                ' Dodawanie grzejników bez DataSource, bo wtedy
                ' nie można dodawać nowych grzejników
                ' --------------------------------------------

                xmlDoc.Load(XMLfilePath) ' załadowanie pliku do pamięci

                Dim nodes As XmlNodeList = xmlDoc.DocumentElement.SelectNodes("/NewDataSet/Wybrane_Grzejniki")
                Dim node As XmlNode = Nothing

                ' Dodawanie każdej komórki po koleji
                For Each node In nodes
                    pName = node.Name
                    dgvListaZamowionychGrzejnikow.Rows.Add(EmptyStringToNull(node("Kod").InnerText), _
                                                           EmptyStringToNull(node("Kod_x0020_EAN").InnerText), _
                                                           EmptyStringToNull(node("Indeks_x0020_Onninen").InnerText), _
                                                           EmptyStringToNull(node("Referencja_x0020_LM").InnerText), _
                                                           EmptyStringToNull(node("Nazwa").InnerText), _
                                                           EmptyStringToNull(node("Opis").InnerText), _
                                                           EmptyStringToNull(node("Typ").InnerText), _
                                                           EmptyStringToNull(node("Wysokosc_x0020__x0028_mm_x0029_").InnerText), _
                                                           EmptyStringToNull(node("Szerokosc_x0020__x0028_mm_x0029_").InnerText), _
                                                           EmptyStringToNull(node("Glebokosc_x0020__x0028_mm_x0029_").InnerText), _
                                                           EmptyStringToNull(node("_x0039_0_x002F_70_x002F_20_x0020__x0028_W_x0029_").InnerText), _
                                                           EmptyStringToNull(node("_x0037_5_x002F_65_x002F_20_x0020__x0028_W_x0029_").InnerText), _
                                                           EmptyStringToNull(node("_x0037_0_x002F_55_x002F_20_x0020__x0028_W_x0029_").InnerText), _
                                                           EmptyStringToNull(node("_x0035_5_x002F_45_x002F_20_x0020__x0028_W_x0029_").InnerText), _
                                                           EmptyStringToNull(node("_x0039_0_x002F_70_x002F_20_x0020__x0028_m2_x0029_").InnerText), _
                                                           EmptyStringToNull(node("_x0037_5_x002F_65_x002F_20_x0020__x0028_m2_x0029_").InnerText), _
                                                           EmptyStringToNull(node("_x0037_0_x002F_55_x002F_20_x0020__x0028_m2_x0029_").InnerText), _
                                                           EmptyStringToNull(node("_x0035_5_x002F_45_x002F_20_x0020__x0028_m2_x0029_").InnerText), _
                                                           EmptyStringToNull(node("Rur_x0020_horyz.").InnerText), _
                                                           EmptyStringToNull(node("Podlaczenie").InnerText), _
                                                           EmptyStringToNull(node("Kolor").InnerText), _
                                                           EmptyStringToNull(node("Sred._x0020_rury_x00A0__x0028_mm_x0029_").InnerText), _
                                                           EmptyStringToNull(node("Rozstaw_x0020__x0028_mm_x0029_").InnerText), _
                                                           EmptyStringToNull(node("KG").InnerText), _
                                                           EmptyStringToNull(node("Wym._x0020_opak.").InnerText), _
                                                           EmptyStringToNull(node("Gwarancja").InnerText), _
                                                           EmptyStringToNull(node("Pow._x0020_grzejnika_x0020__x0028_m2_x0029_").InnerText), _
                                                           EmptyStringToNull(node("Sztuk").InnerText))
                Next

                ' Autosize DGV dla wyświtlanych danych w komókach
                dgvListaZamowionychGrzejnikow.AutoSizeColumnsMode = DataGridViewAutoSizeColumnMode.AllCells

                ' Info dla usera o sukcesie importu danych z pliku XML
                MsgBox("Zaimportowano dane z pliku XML.", vbInformation, "POTWIERDZENIE...")

            Else
                ' Info jeżeli jakiś błąd
                'MsgBox("Bliżej nieokreślony błąd.", vbCritical, "ERROR...")
            End If

        Catch ex As Exception
            ' Info o błędzie gdyby jakiś błąd pojawił się
            MsgBox("Nie można utworzyć pliku XML w lokalizacji:" & Chr(10) & "'" & OpenDLG.FileName & "'." & Chr(10) & Chr(10) & _
                   "Kod błędu:" & Chr(10) & ex.Message, MsgBoxStyle.Critical, "BŁĄD XML...")
        End Try
End Sub
Teraz trochę prościej wyglądający import danych, czyli przez DataSource:

Źródło:
http://vb.net-informations.com/xml/vb.net-xml-to-DataGridView.htm

Private Sub txtImportDGV_Click(sender As Object, e As EventArgs) Handles txtImportDGV.Click
        ' Import wcześniej zapisanego pliku XML
        ' z danymi z DataGridView.
        ' Kod z neta:
        ' http://vb.net-informations.com/xml/vb.net-xml-to-DataGridView.htm

        Dim XMLfilePath As String
        Dim OpenDLG As New OpenFileDialog
        Dim xmlFile As XmlReader

        ' Filtr dla OpenFileDialog
        ' Tylko XML i wszystkie pliki
        OpenDLG.Filter = "Pliki XML (*.xml)|*.xml|Wszystkie pliki (*.*)|*.*"
        OpenDLG.FilterIndex = 1
        OpenDLG.Multiselect = False
        OpenDLG.Title = "Wybierz plik..."

        ' Próba importu DataGridView z zapisanymi wcześniej grzejnikami
        Try

            ' Otwieranie okna do wskazania pliku XML do zaimportowania
            If OpenDLG.ShowDialog() = DialogResult.OK Then
                XMLfilePath = OpenDLG.FileName ' ścieka do pliku XML


                xmlFile = XmlReader.Create(XMLfilePath, New XmlReaderSettings())
                Dim ds As New DataSet
                ds.ReadXml(xmlFile)
                DataGridView2.DataSource = ds.Tables(0)

                ' Info dla usera o sukcesie importu danych z pliku XML
                MsgBox("Zaimportowano dane z pliku XML.", vbInformation, "POTWIERDZENIE...")
           
            Else
                ' Info jeżeli jakiś błąd
                'MsgBox("Bliżej nieokreślony błąd.", vbCritical, "ERROR...")
            End If

        Catch ex As Exception
            ' Info o błędzie gdyby jakiś błąd pojawił się
            MsgBox("Nie można utworzyć pliku XML w lokalizacji:" & Chr(10) & "'" & OpenDLG.FileName & "'." & Chr(10) & Chr(10) & _
                   "Kod błędu:" & Chr(10) & ex.Message & ".", MsgBoxStyle.Critical, "BŁĄD XML...")
        End Try
End Sub
Import danych z XML poprzez OpenFileDialog do poszczególnych textboxów wygląda tak:

Źródło:
http://vb.net-informations.com/xml/open-xml-vb.net.htm

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles txtImport.Click

        ' Importowanie danych z pliku XML,
        ' który został stworzony poprzednio przez usera.
        ' Kod pobrany z:
        ' http://vb.net-informations.com/xml/open-xml-vb.net.htm

        Dim XMLfilePath As String
        Dim OpenDLG As New OpenFileDialog
        Dim xmlDoc As New XmlDocument()
        Dim pName As String = ""

        ' Filtr dla OpenFileDialog
        ' Tylko XML i wszystkie pliki
        OpenDLG.Filter = "Pliki XML (*.xml)|*.xml|Wszystkie pliki (*.*)|*.*"
        OpenDLG.FilterIndex = 1
        OpenDLG.Multiselect = False
        OpenDLG.Title = "Wybierz plik..."

        ' Próba zaimportowania pliku XML z Kryteriami
        Try

            ' Otwieranie okna do wskazania pliku XML do zaimportowania
            If OpenDLG.ShowDialog() = DialogResult.OK Then
                XMLfilePath = OpenDLG.FileName ' ścieka do pliku XML
                xmlDoc.Load(XMLfilePath) ' załadowanie pliku do pamięci

                Dim nodes As XmlNodeList = xmlDoc.DocumentElement.SelectNodes("/Table/Kryteria")

                ' Przypisywanie wartości z pliku XML do textboxów w programie
                For Each node As XmlNode In nodes
                    pName = node.SelectSingleNode("Kryteria_name").InnerText

                    ' Jeżeli jest zgodność nazwy z kryteriów w programie
                    ' to wartość z pliku XML dopisywanie jest do odpwiedniego textboxa
                    Select Case pName
                        Case "Orientacja"
                            txtOrientacja.Text = node.SelectSingleNode("Kryteria_value").InnerText
                        Case "Norma"
                            txtNorma.Text = node.SelectSingleNode("Kryteria_value").InnerText
                        Case "Moc"
                            txtMoc.Text = node.SelectSingleNode("Kryteria_value").InnerText
                        Case "Szerokosc"
                            txtSzerokosc.Text = node.SelectSingleNode("Kryteria_value").InnerText
                        Case "Wysokosc"
                            txtWysokosc.Text = node.SelectSingleNode("Kryteria_value").InnerText
                    End Select
                Next

                ' Info dla usera o sukcesie importu danych z pliku XML
                MsgBox("Zaimportowano dane z pliku XML.", vbInformation, "POTWIERDZENIE...")
            Else
                ' Info jeżeli jakiś błąd
                ' MsgBox("Bliżej nieokreślony błąd.", vbInformation, "ERROR...")
            End If

        Catch ex As Exception
            ' Info o błędzie gdyby jakiś błąd pojawił się
            MsgBox("Nie można zaimportować pliku XML z lokalizacji:" & Chr(10) & "'" & OpenDLG.FileName & "'." & Chr(10) & Chr(10) & _
                   "Kod błędu:" & Chr(10) & ex.Message & ".", MsgBoxStyle.Critical, "BŁĄD XML...")
        End Try

    End Sub

Eksport wartości z textboxów do pliku XML przez SaveFileDialog wygląda tak:

Źródło:
http://vb.net-informations.com/xml/create-xml-vb.net.htm
http://vb.net-informations.com/xml/create-xml-vb.net.htm

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles txtEksport.Click
        ' Możliwość zapisu kryteriów do pliku XML
        ' Eksport kryteriów

        Dim XMLPath As String
        Dim SaveDLG As New SaveFileDialog

        ' Opcje dla SaveFileDialog
        ' Możliwość zapisy tylko i wyłącznie do pliku XML
        SaveDLG.Filter = "Plik xml (*.xml)|*.xml"
        SaveDLG.FilterIndex = 1
        SaveDLG.Title = "Podaj ścieżkę i nazwę pliku..."

        ' Tworznie pliku XML
        ' Dodano TRY gdyby miały być jakieś błędy przy tworzeniu XML
        Try

            ' Otwieranie SaveFileDialog, aby można było
            ' podać lokalizację pliku XML
            If SaveDLG.ShowDialog() = DialogResult.OK Then
                ' Jeżeli DialogResult = OK i Filname jest podany
                XMLPath = SaveDLG.FileName

                ' Jeżeli w/w warunki zostały spełnione to plik XML jest towrzony.
                ' Kod pobrany ze storny:
                ' http://vb.net-informations.com/xml/create-xml-vb.net.htm

                Dim writer As New XmlTextWriter(XMLPath, System.Text.Encoding.UTF8)
                writer.WriteStartDocument(True)
                writer.Formatting = Formatting.Indented
                writer.Indentation = 2
                writer.WriteStartElement("Table")
                createNode(1, "Orientacja", txtOrientacja.Text, writer)
                createNode(2, "Norma", txtNorma.Text, writer)
                createNode(3, "Moc", txtMoc.Text, writer)
                createNode(4, "Szerokosc", txtSzerokosc.Text, writer)
                createNode(5, "Wysokosc", txtWysokosc.Text, writer)
                writer.WriteEndElement()
                writer.WriteEndDocument()
                writer.Close()

                ' Info dla usera o sukcesie eksportu danych do pliku
                MsgBox("Stworzono plik XML w lokalizacji:" & Chr(10) & _
                      "'" & XMLPath & "'.", vbInformation, "POTWIERDZENIE...")

            Else
                ' Jeżeli błąd to info
                ' MsgBox("Bliżej nieokreślony błąd.", vbInformation, "ERROR...")
            End If

        Catch ex As Exception
            ' Info o błędzie gdyby jakiś błąd pojawił się
            MsgBox("Nie można utworzyć pliku XML w lokalizacji:" & Chr(10) & "'" & SaveDLG.FileName & "'." & Chr(10) & Chr(10) & _
                   "Kod błędu:" & Chr(10) & ex.Message & ".", MsgBoxStyle.Critical, "BŁĄD XML...")
        End Try

    End Sub

    Private Sub createNode(ByVal pID As String, ByVal pName As String, ByVal pValue As String, ByVal writer As XmlTextWriter)
        ' Kod do Button1_Click
        ' Kod pobrany ze storny:
        ' http://vb.net-informations.com/xml/create-xml-vb.net.htm

        writer.WriteStartElement("Kryteria")
        writer.WriteStartElement("Kryteria_id")
        writer.WriteString(pID)
        writer.WriteEndElement()
        writer.WriteStartElement("Kryteria_name")
        writer.WriteString(pName)
        writer.WriteEndElement()
        writer.WriteStartElement("Kryteria_value")
        writer.WriteString(pValue)
        writer.WriteEndElement()
        writer.WriteEndElement()
End Sub
A w taki sposób można zapisać dane w XML z DataGridView:

Źródło:
https://social.msdn.microsoft.com/Forums/en-US/555d7a5d-f3ae-48e1-b5f8-41a4f372c0eb/saving-datagridview-data-to-xml?forum=vbgeneral

Private Sub txtEksportDGV_Click(sender As Object, e As EventArgs) Handles txtEksportDGV.Click
        ' Eksport DataGridView do pliku XML
        ' Kod wzięty z neta:
        'https://social.msdn.microsoft.com/Forums/en-US/555d7a5d-f3ae-48e1-b5f8-41a4f372c0eb/saving-datagridview-data-to-xml?forum=vbgeneral

        Dim XMLPath As String
        Dim SaveDLG As New SaveFileDialog
        Dim dt As New DataTable
        
        ' Opcje dla SaveFileDialog
        ' Możliwość zapisy tylko i wyłącznie do pliku XML
        SaveDLG.Filter = "Plik xml (*.xml)|*.xml"
        SaveDLG.FilterIndex = 1
        SaveDLG.Title = "Wybierz plik XML..."

        ' Zapisanie DGV do pliku XML
        Try

            ' Otwieranie SaveFileDialog, aby można było
            ' podać lokalizację pliku XML
            If SaveDLG.ShowDialog() = DialogResult.OK Then
                ' Jeżeli DialogResult = OK i Filname jest podany
                XMLPath = SaveDLG.FileName


                dt = CType(DataGridView1.DataSource, DataTable)
                ' Trzeba nadać nazwę tabeli,
                ' bo inaczej jest błąd. Kod wzięty z neta:
                ' http://forums.asp.net/t/1335298.aspx?error+Cannot+serialize+the+DataTable+DataTable+name+is+not+set+
                dt.TableName = "Wybrane_Grzejniki"
                dt.AcceptChanges()
                dt.WriteXml(XMLPath, System.Data.XmlWriteMode.WriteSchema, False)

          
                ' Info dla usera o sukcesie eksportu danych do pliku
                ' Zapytanie usera czy chce weksportować także dane kontakowe
                ' klienta jako osobny plik.
                TakNie = MsgBox("Stworzono plik XML w lokalizacji:" & Chr(10) & "'" & XMLPath & "'.", vbInformation, "POTWIERDZENIE...")

            End If 'End if so ShowDialog zapis DataGridView1

        Catch ex As Exception
            ' Info o błędzie gdyby jakiś błąd pojawił się
            MsgBox("Nie można utworzyć pliku XML w lokalizacji:" & Chr(10) & "'" & SaveDLG.FileName & "'." & Chr(10) & Chr(10) & _
                   "Kod błędu:" & Chr(10) & ex.Message & ".", MsgBoxStyle.Critical, "BŁĄD XML...")
        End Try

End Sub

 

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.