1

我正在做一个项目,我必须将从 XML 文件读取的数据保存到数据库中,我已经在使用我制作的代码,但它有点原始,我正在使用 XMLTextReader 和其他一些方法来导航通过文件上的代码行并读取我想要的数据,但是如果我在我的程序上使用序列化,我已经读过这将是非常“容易”,现在我已经看到了一些这样的例子,老实说还不太了解它们,甚至以前从未听说过它们,所以如果有人可以笼统地向我解释它并提供一个小例子来说明我如何将它应用到我的项目中,那就太好了。

这就是我现在所拥有的:

For y As Integer = 0 To 167
            Dim reader1 As XmlTextReader = New XmlTextReader(dir)

            reader1.ReadStartElement("response")
            reader1.ReadToNextSibling("hourly_forecast")
            reader1.ReadStartElement("hourly_forecast")
            reader1.ReadToNextSibling("forecast")
            reader1.ReadStartElement("forecast")

            CurrentLine= reader1.LineNumber
            If CurrentLine= LastLine Then
                reader1.ReadToNextSibling("forecast")
                CurrentLine= reader1.LineNumber
            End If
            While reader1.LineNumber <= LastLine
                For w As Integer = 0 To y
                    reader1.ReadToNextSibling("forecast")
                    CurrentLine= reader1.LineNumber
                Next w
            End While

            LastLine = CurrentLine
            For x As Integer = 1 To 2
                Dim reader As XmlTextReader = New XmlTextReader(dir)

                reader.ReadStartElement("response")
                reader.ReadToNextSibling("hourly_forecast")
                reader.ReadStartElement("hourly_forecast")
                reader.ReadToNextSibling("forecast")
                Do While reader.LineNumber < CurrentLine
                    reader.ReadToNextSibling("forecast")
                Loop
                reader.ReadStartElement("forecast")

                If x = 1 Then
                    reader.ReadToNextSibling("FCTTIME")
                    reader.ReadStartElement("FCTTIME")
                    reader.ReadToNextSibling("hour")
                    values(y, x) = reader.ReadString()
                    d = values(y, x)
                    reader.ReadToNextSibling("year")
                    year = lector.ReadString()
                    reader.ReadToNextSibling("mon_padded")
                    month = reader.ReadString()
                    reader.ReadToNextSibling("mday_padded")
                    day= reader.ReadString()
                    a = year.Chars(2)
                    b = year.Chars(3)
                    c = a + b
                    x = x - 1
                    values(y, x) = day + "-" + month + "-" + c
                    x = x + 1
                End If
                If x = 2 Then
                    reader.ReadToNextSibling("temp")
                    reader.ReadStartElement("temp")
                    reader.ReadToNextSibling("metric")
                    values(y, x) = reader.ReadString()
                End If

            Next x

        Next y

这是我的 XML 的示例:

 <response>
  <version>0.1</version> 
  <features>
   <feature>hourly10day</feature> 
  </features>
  <hourly_forecast>
   <forecast>
    <FCTTIME>
     <hour>16</hour> 
     <year>2012</year> 
     <mon_padded>10</mon_padded> 
     <mday_padded>05</mday_padded> 
    </FCTTIME>
    <temp>
     <english>102</english> 
     <metric>39</metric> 
    </temp>
   </forecast>
  </hourly_forecast>
 </response>

现在,这可行,但是我如何将反序列化应用于它?谢谢!

4

1 回答 1

1

序列化是“简单的”,因为您可以用几行代码将 XML 转换为对象。但是根据 XML 和/或对象的复杂性,您可能需要进行一些设置(通过向类定义添加属性)才能使序列化成功。

例如,我认为,对您的 XML 进行一些修饰是必要的。这是一组可以代表您的示例 XML 的类的开始:

<XmlRoot("response")>
Public Class Response
    <XmlElement("version")>
    Public Property Version As String
    <XmlArrayItem("feature")>
    <XmlArray("features")>
    Public Property Features As List(Of String)
    <XmlElement("hourly_forecast")>
    Public Property HourlyForecast As HourlyForecast
End Class

Public Class HourlyForecast
    <XmlElement("forecast")>
    Public Property Forecast As Forecast
End Class

Public Class Forecast
    <XmlElement("FCTTIME")>
    Public Property FctTime As FctTime
End Class

Public Class FctTime
    <XmlElement("hour")>
    Public Property Hour As String
    <XmlElement("year")>
    Public Property Year As String
    <XmlElement("mon_padded")>
    Public Property PaddedMonth As String
    <XmlElement("mday_padded")>
    Public Property PaddedMonthDay As String
End Class

您会注意到许多属性和其中一个类都用属性修饰。这些属性帮助序列化程序将 XML 中的每个值的位置协调到对象中的适当属性中。通常,人们会将类和属性命名为与 XML 中相同的名称。这样做时,您通常可以逃脱而不必使用属性。在这种情况下,因为 .NET 的做法是对类和属性名称使用 Pascal 大小写,并且因为您的 XML 使用小写字母,所以我插入了属性以正确地将每个 XML 节点与相应的属性/类相关联。如果不这样做,序列化程序将无法正确地将元素映射到对象。

我提到过从 XML 转移到代码中的对象可以用几行代码完成。这可能是这样的:

Imports System.Xml.Serialization
Imports System.IO

Module Module1

    Sub Main()
        Dim serializer As New XmlSerializer(GetType(Response))
        Dim reader As New StreamReader("dump.xml")
        Dim instance As Response = serializer.Deserialize(reader)

        reader.Dispose()
    End Sub

End Module

虽然构造表示 XML 的类的代码确实需要几行代码,但这是不可避免的。在你的方法中你会有类似的东西——当然,除了属性。这里的节省是您可以在一次快速调用Serialize方法中转换对象。

于 2012-10-07T07:13:52.807 回答