我正在开发一个项目,我必须将从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>
现在,这有效,但我怎么能将反序列化应用到它?谢谢!
答案 0 :(得分: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
方法。