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:
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