从XML文件调用文本消息

时间:2009-05-13 15:53:35

标签: c# xml visual-studio-2008

目前我正在开发一种使用Visual Studio 2008和C#的分层架构的软件。 在那个系统中,我想在XML文件中保留所有文本消息(必要时使用消息框显示),这样如果我更新任何消息,我就不必编译整个系统。我怎么能做到这一点?什么是XML文件结构?如何从C#代码调用消息?请描述并举例说明。 感谢。

3 个答案:

答案 0 :(得分:1)

您的方案的更好选择可能是资源附属DLL。这是一个单独的DLL,其中包含一组动态加载到应用程序中的资源。这是多少不同的应用程序进行本地化。最重要的是,有许多工具支持这种功能。

更改消息只会涉及更改此DLL。这确实导致编译,但只导致资源而不是系统。

答案 1 :(得分:1)

我会创建一个使用.NET DataSet和DataTable来存储id和消息(以及你需要的任何其他内容)的类。

这样,类可以使用DataSet.WriteXML()和DataSet.ReadXML()从您指定的任何文件名中保存/加载,您不必担心自己“手工制作”XML格式。

这听起来像一个方便的课程,所以我写了一个作为“概念证明”:

'*************************************************************************
'   Class: MsgFile
'  Author: Ron Savage
'    Date: 05/14/2009
'
' This class is an example for using an XML file to hold messages to be
' displayed by an application.
'
' Modification History
' Date        Init Comment
' 05/14/2009  RS   Created.
'*************************************************************************
Imports Microsoft.VisualBasic
Imports System.IO

Public Class MsgFile
   '*************************************************************************
   ' Class Variables
   '*************************************************************************
   Private MsgFile As String
   Private msgData As DataSet
   Private msgTable As DataTable

   '*************************************************************************
   '     Sub: New()
   '  Author: Ron Savage
   '    Date: 05/14/2009
   '
   ' Creates a new MsgFile from an existing file, or creates an empty one
   ' with the specified file name.
   '*************************************************************************
   Sub New(ByVal msg_File As String)
      Dim srcFile As New FileInfo(msg_File)

      If (srcFile.Exists()) Then
         msgData = New DataSet()

         Load(msg_File)
      Else
         NewFile(msg_File)
      End If
   End Sub

   '*************************************************************************
   '     Sub: NewFile()
   '  Author: Ron Savage
   '    Date: 05/14/2009
   '
   ' Creates a new XML message file.
   '*************************************************************************
   Sub NewFile(ByVal msg_File As String)
      Me.MsgFile = msg_File

      If (IsNothing(msgData)) Then
         msgData = New DataSet("MyAppMessages")
         msgTable = New DataTable("Messages")

         msgTable.Columns.Add(New DataColumn("Id", GetType(System.Int32), Nothing, MappingType.Attribute))
         msgTable.Columns.Add(New DataColumn("Text", GetType(System.String), Nothing, MappingType.Attribute))

         msgData.Tables.Add(msgTable)

         setMessage(0, "New file created")
      End If

      Save()
   End Sub

   '*************************************************************************
   '     Sub: Load()
   '  Author: Ron Savage
   '    Date: 05/14/2009
   '
   ' Loads an existing XML message file into the dataset.
   '*************************************************************************
   Public Sub Load(ByVal msgFileName As String)
      Dim srcFile As FileInfo = Nothing
      Me.MsgFile = msgFileName

      srcFile = New FileInfo(msgFileName)

      msgData.Clear()

      If (srcFile.Exists()) Then
         msgData.ReadXml(msgFileName)

         msgTable = msgData.Tables("Messages")
      End If
   End Sub

   '*************************************************************************
   '     Sub: Save()
   '  Author: Ron Savage
   '    Date: 10/05/2008
   '
   ' This routine saves the DataSet to an XML file.
   '*************************************************************************
   Public Overridable Sub Save()
      If (Not IsNothing(msgData) And Not MsgFile.Equals("")) Then
         Dim fileWriter As StreamWriter = New StreamWriter(MsgFile)


         msgData.WriteXml(fileWriter)

         fileWriter.Close()
      End If
   End Sub

   '*************************************************************************
   '     Sub: getMessage()
   '  Author: Ron Savage
   '    Date: 05/14/2009
   '
   ' This gets the text of the message.
   '*************************************************************************
   Public Function getMessage(ByVal msgId As String) As String
      Dim rowsFound() As System.Data.DataRow
      Dim msgText As String = ""

      If (Not IsNothing(msgTable)) Then
         rowsFound = msgTable.Select("Id = " + msgId.ToString)

         If (rowsFound.Length > 0) Then
            msgText = rowsFound(0).Item("Text").ToString
         End If

      End If
      Return (msgText)
   End Function

   '*************************************************************************
   '     Sub: setMessage()
   '  Author: Ron Savage
   '    Date: 05/14/2009
   '
   ' This sets the text of the message.
   '*************************************************************************
   Public Sub setMessage(ByVal msgId As Integer, ByVal msgText As String)
      Dim rowsFound() As System.Data.DataRow
      Dim msgRow As System.Data.DataRow

      If (Not IsNothing(msgTable)) Then
         rowsFound = msgTable.Select("Id = " + msgId.ToString)

         If (rowsFound.Length > 0) Then
            msgRow = rowsFound(0)

            msgRow.Item("Id") = msgId
            msgRow.Item("Text") = msgText
         Else
            msgRow = msgTable.NewRow()

            msgRow.Item("Id") = msgId
            msgRow.Item("Text") = msgText

            msgTable.Rows.Add(msgRow)
         End If
      End If

      Save()
   End Sub
End Class

答案 2 :(得分:0)

您可能希望将自己的自定义部分添加到app.config文件中以存储邮件。但是,每次邮件更改时,都需要您更新app.config文件。

http://msdn.microsoft.com/en-us/library/system.configuration.configurationsection.aspx