使用vb.net通过xml实践存储数据

时间:2014-10-20 13:38:39

标签: xml vb.net

我开始这是一个自学教练,现在我很难过。如果有人能帮助我学习,我会非常感激,通过我的解释练习和必要的内容。

我编写了一个非常基本的基本应用程序,其功能如下:

  • 通过文本框接受文本输入
  • 保存按钮将信息存储在xml文件中
  • 清除按钮可从文本框中删除信息
  • 检索按钮从xml文件中读取信息并在文本框中显示数据

图形上我的表格有4个文本框,与4个标签配对,标记如下:

  • 名称
  • 颜色
  • 邮政编码

它有3个按钮,一个用于保存数据,一个用于清除数据(从表单而非xml文件),另一个用于检索数据(在文本框中重新显示)。

到目前为止,这是我的代码:

    Imports System.Xml

Public Class Form1

    Private Sub Save_Data(Optional ByVal name As String = "", Optional ByVal color As String = "", Optional ByVal number As String = "", Optional ByVal zipcode As String = "")
        Dim writer As New XmlTextWriter("saved_data.xml", System.Text.Encoding.UTF8)
        Try
            writer.WriteStartDocument(True)
            writer.Formatting = Formatting.Indented
            writer.Indentation = 2

            writer.WriteStartElement("Saved_Data")
            If Not txtName.Text = "" Then
                writer.WriteStartElement("name")
                writer.WriteString(name)
                writer.WriteEndElement()
            End If
            If Not txtColor.Text = "" Then
                writer.WriteStartElement("color")
                writer.WriteString(color)
                writer.WriteEndElement()
            End If
            If Not txtNumber.Text = "" Then
                writer.WriteStartElement("number")
                writer.WriteString(number)
                writer.WriteEndElement()
            End If
            If Not txtZipCode.Text = "" Then
                writer.WriteStartElement("zipcode")
                writer.WriteString(zipcode)
                writer.WriteEndElement()
            End If
                writer.WriteEndElement()
        Catch ex As Exception
            MessageBox.Show("There was an error storing the data!" + vbCrLf + vbCrLf + "Error: " + ex.Message)
        Finally
            writer.Close()
        End Try
    End Sub

    Private Sub Retrieve_Data()
        Dim reader As New XmlTextReader("saved_data.xml")
        Try
            While reader.Read()
                reader.ReadStartElement("Saved_Data")

                If Not reader.IsEmptyElement Then
                    reader.ReadStartElement("name")
                    txtName.Text = reader.ReadString()
                    reader.ReadEndElement()
                End If

                If Not reader.IsEmptyElement Then
                    reader.ReadStartElement("color")
                    txtColor.Text = reader.ReadString()
                    reader.ReadEndElement()
                End If

                If Not reader.IsEmptyElement Then
                    reader.ReadStartElement("number")
                    txtNumber.Text = reader.ReadString()
                    reader.ReadEndElement()
                End If

                If Not reader.IsEmptyElement Then
                    reader.ReadStartElement("zipcode")
                    txtZipCode.Text = reader.ReadString()
                    reader.ReadEndElement()
                End If

                reader.ReadEndElement()

            End While
        Catch ex As Exception
            MessageBox.Show("There was an error retrieving the data!" + vbCrLf + vbCrLf + "Error: " + ex.Message)
        Finally
            reader.Close()
        End Try
    End Sub

    Private Sub btnSave_Click(sender As System.Object, e As System.EventArgs) Handles btnSave.Click
        Dim strName As String = txtName.Text
        Dim strColor As String = txtColor.Text
        Dim strNumber As String = txtNumber.Text
        Dim strZipCode As String = txtZipCode.Text

        Save_Data(strName, strColor, strNumber, strZipCode)

    End Sub

    Private Sub btnClear_Click(sender As System.Object, e As System.EventArgs) Handles btnClear.Click
        txtName.Text = ""
        txtColor.Text = ""
        txtNumber.Text = ""
        txtZipCode.Text = ""
    End Sub

    Private Sub btnRetrieve_Click(sender As System.Object, e As System.EventArgs) Handles btnRetrieve.Click
        Retrieve_Data()
    End Sub
End Class

请记住,我之前从未使用过xml,因此我可能也不了解它的vb.net方面。

这个项目的最终目标是创建一个"自动保存"在较大的项目上使用的结构。它在计时器上保存的位置,或在文本框中键入的AS。这样你就可以点击"清除"按钮随时,然后单击"检索"按钮从上次保存的数据中恢复。

我目前的问题是:"错误:' EndElement'是无效的XmlNodeType。第6行,第3位。" 检索数据时发生此错误。当我为错误添加快速监视时,它指向处理数据的任何块,从保存数据时保留空白的文本框输入。

以下是出现上述错误后生成的xml结果。我已离开"邮政编码"文本框空白。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Saved_Data>
  <name>Tony</name>
  <color>purple</color>
  <number>20</number>
  <zipcode />
</Saved_Data>

在此先感谢您的帮助,我期待着学习这一点!

2 个答案:

答案 0 :(得分:0)

将Retrieve_Data方法替换为:

Private Sub Retrieve_Data()
        Dim reader As New XmlTextReader("c:\\d.xml")
        Try
            While reader.Read()
                reader.ReadStartElement("Saved_Data")

                reader.ReadStartElement("name")
                If Not reader.IsEmptyElement Then
                    txtName.Text = reader.ReadString()
                End If
                reader.ReadEndElement()

                reader.ReadStartElement("color")
                If Not reader.IsEmptyElement Then
                    txtColor.Text = reader.ReadString()
                End If
                reader.ReadEndElement()

                reader.ReadStartElement("number")
                If Not reader.IsEmptyElement Then
                    txtNumber.Text = reader.ReadString()
                End If
                reader.ReadEndElement()

                reader.ReadStartElement("zipcode")
                If Not reader.IsEmptyElement Then
                    txtZipCode.Text = reader.ReadString()
                End If
                reader.ReadEndElement()

                If Not reader.ReadState = ReadState.EndOfFile Then
                    reader.ReadEndElement()
                End If
            End While
        Catch ex As Exception
            MessageBox.Show("There was an error retrieving the data!" + vbCrLf + vbCrLf + "Error: " + ex.Message)
        Finally
            reader.Close()
        End Try
    End Sub

注意每个块都已更改的事实,以及最终读取周围的额外代码...

答案 1 :(得分:0)

首先要学习的是保留代码DRY, that is - don't repeat yourself。如果你注意到你的代码变得枯燥无味,你几乎无法分辨出每个块正在做什么,因为它与之前的代码非常相似 - 就是这样。停止并重构。如果你愿意投入时间,总有办法让代码变得更好。

在您的案例中阅读XML可以使用更少的代码行(LINQ-to-XML)来完成:

Dim xDoc As XDocument = XDocument.Load("saved_data.xml")
With xDoc.Root
  txtName.Text = .Element("name").Value
  txtColor.Text = .Element("color").Value
  txtNumber.Text = .Element("number").Value
  txtZipCode.Text = .Element("zipcode").Value
End With

随着您的XML结构变得越来越复杂,您采取的方法将成为维护的噩梦。 XDocument但是非常灵活,专门用于处理复杂的案例。使用LINQ-to-XML方法,即使XML层次结构扩展为多个深度嵌套的节点,也可以使读取过程非常简单。

我将写作XML作为你的作业。试一试,从我上面给出的例子中可以很容易。如果您需要帮助,请告诉我。