2014-10-20 63 views
1

我開始這是一個自我教學練習,現在我很難過。如果有人能夠幫助我學習,我將非常感激,通過走過我將要解釋的練習和必要的內容。使用vb.net通過xml存儲數據練習

我寫了一個非常基本的,可視化的基本應用程序,其功能如下:

  • 通過文本框接受文本輸入
  • Save按鈕保存在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的一面。

該項目的最終目標是創建一個「自動保存」結構,以用於較大的項目。它可以保存在計時器上,也可以保存在文本框中。因此,您可以隨時點擊「清除」按鈕,然後點擊「檢索」按鈕從上次保存的數據中恢復。

我當前的問題是這樣的:「錯誤:'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> 

在此先感謝您的幫助,我期待着學習!

回答

0

首先要學習的是保留您的代碼DRY, that is - don't repeat yourself。如果你注意到你的代碼變得無聊,你幾乎不知道每個塊在做什麼,因爲它和前一塊非常相似 - 就是這樣。停止並重構。如果你願意投入時間,總能找到更好的代碼。

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結構變得更加複雜,你所採取的做法將成爲維護:

在你的情況下讀取XML可以用的代碼(LINQ到XML)較少的線路來完成惡夢。 XDocument,但是非常靈活,專門爲處理複雜情況而構建。使用LINQ-to-XML方法,即使您的XML層次結構擴展到幾個深度嵌套的節點,也可以使讀取過程變得非常簡單。

我會留下寫作XML作爲你的功課。給它一個鏡頭,應該很容易從上面給出的例子。讓我知道你是否需要幫助。

+0

感謝您的答案的優雅!我很欣賞這個例子以及學習支持的方向。就像我之前提到的,我一直在使用vb.net一段時間,但在合併外部程序和/或語言方面,我仍然是新手。我會投這個答案,但我缺乏這個能力...... :-( – Cody 2014-10-20 18:00:38

+0

@Cody:不客氣!應該能夠在15聲望上升,並且你快到了!:)你仍然可以接受我的答案,如果你喜歡它。 – Neolisk 2014-10-20 18:25:31

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 

注重事實,即每塊已經改變,並且是圍繞最終讀取額外的代碼...

+0

謝謝馬丁的迴應!我同意你重構ReadStartElement塊的方式。今天早些時候我有相同的結構,但通過故障排除我改變了它。我不知道有關「reader.ReadState」的感謝,因爲這會引起我的注意! 不幸的是我仍然收到上面提到的錯誤.. – Cody 2014-10-20 14:16:26

+0

我忘了提及一些東西!如果我手動編輯上面顯示的xml文件來讀取而不是它將運行沒有錯誤。我認爲這個問題存在於速記過程中。 – Cody 2014-10-20 14:20:51

+0

它使用我的代碼在我的機器上運行時沒有錯誤......奇怪的是你有問題。您可能還想看看XLinq - XDocument,XElement和朋友...... – 2014-10-21 08:33:00