【问题标题】:Using vb.net to store data via xml practice使用vb.net通过xml存储数据实践
【发布时间】:2014-10-20 13:38:39
【问题描述】:

我开始这是一个自学练习,现在我很难过。如果有人能帮助我学习,我将不胜感激,通过引导我完成我的待解释练习和必要的内容。

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

  • 接受通过文本框输入的文本
  • 保存按钮将信息存储在 xml 文件中
  • 清除按钮从文本框中删除信息
  • Retrieve 按钮从 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 方面。

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

我当前的问题是:“错误:'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>

提前感谢您的帮助,我期待学习这个!

【问题讨论】:

    标签: xml vb.net


    【解决方案1】:

    首先要学习的是保留您的代码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 作为作业留给你。试一试,从我上面给出的例子中应该很容易。如果您需要帮助,请告诉我。

    【讨论】:

    • 感谢您的优雅回答!我很欣赏这个例子以及学习支持方向。就像我之前提到的,我使用 vb.net 已经有一段时间了,但在整合外部程序和/或语言方面我仍然是新手。我会投票赞成这个答案,但我缺乏能力...... :-(
    • @Cody:不客气!应该能够在 15 声望时投票,你就快到了! :) 如果您愿意,您仍然可以接受我的回答。
    【解决方案2】:

    用这个替换你的 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
    

    注意每个块都发生了变化,以及最终读取周围的额外代码......

    【讨论】:

    • 感谢马丁的回复!我同意您重组 ReadStartElement 块的方式。我今天早些时候有相同的结构,但尽管进行了故障排除,但我改变了它。我不知道“reader.ReadState”谢谢你让我注意!不幸的是,我仍然收到上述错误..
    • 我忘了提一件事!如果我手动编辑上面显示的 xml 文件以读取 而不是 它将运行而不会出错。我假设问题出在速记过程中。
    • 我的代码在我的机器上运行没有错误......奇怪你遇到了问题。您可能还想看看 Xlinq - XDocument、XElement 和朋友...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    相关资源
    最近更新 更多