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

プロパティの多くとクラスの 1 つが属性で装飾されていることに気付くでしょう。これらの属性は、シリアライザーが 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メソッドへの 1 回の迅速な呼び出しでオブジェクトを変換することです。

于 2012-10-07T07:13:52.807 に答える