反序列化 XML 文件

Deserilise XML Document

我以前从来没有这样做过,我正在碰壁。

这也必须在 vb.net 中完成,这不是我的事。

这是 XML 文件:

<?xml version="1.0" encoding="utf-8" ?>
<Departures>
  <Departure>
    <Destination>Birmingham</Destination>
    <Service>109</Service>
    <AimedDepartureTime>13:50</AimedDepartureTime>
    <ExpectedDepartureTime>13:52</ExpectedDepartureTime>
  </Departure>
  <Departure>
    <Destination>Nuneaton</Destination>
    <Service>19</Service>
    <AimedDepartureTime>13:55</AimedDepartureTime>
    <ExpectedDepartureTime>13:56</ExpectedDepartureTime>
  </Departure>
</Departures>

我需要对它进行反序列化并用它填充数据网格控件。我能做的 DataGrid 东西。

这是 xml 文件的反序列​​化,我遇到了问题。 我创建了一个 class 对象来处理 xml 的 layout/format。 这是 class:

Imports System.Xml.Serialization

<Serializable()>
Public Class Departure
    <System.Xml.Serialization.XmlElement("Destination")>
    Private DestinationValue As String
    Public Property Destination() As String
        Get
            Return DestinationValue
        End Get
        Set(ByVal value As String)
            DestinationValue = value
        End Set
    End Property
    <System.Xml.Serialization.XmlElement("Service")>
    Private ServiceValue As String
    Public Property Service() As String
        Get
            Return ServiceValue
        End Get
        Set(ByVal value As String)
            ServiceValue = value
        End Set
    End Property
    <System.Xml.Serialization.XmlElement("AimedDepartureTime")>
    Private AimedDepartureTimeValue As String
    Public Property AimedDepartureTime() As String
        Get
            Return AimedDepartureTimeValue
        End Get
        Set(ByVal value As String)
            AimedDepartureTimeValue = value
        End Set
    End Property
    <System.Xml.Serialization.XmlElement("xpectedDepartureTime")>
    Private ExpectedDepartureTimeValue As String
    Public Property ExpectedDepartureTime() As String
        Get
            Return ExpectedDepartureTimeValue
        End Get
        Set(ByVal value As String)
            ExpectedDepartureTimeValue = value
        End Set
    End Property
End Class


<Serializable()>
<System.Xml.Serialization.XmlRoot("Departures")>
Public Class Departures
    <XmlArray("Departures"), XmlArrayItem("Departure")>
    Public Departure As Departure()
End Class

这是我的调用代码:

Private Sub btnXmlloader_Click(sender As Object, e As EventArgs) Handles btnXmlloader.Click
    Try
        Dim p As New Departures
        Dim x As New XmlSerializer(p.GetType)

        'Deserialize text file to a new object.
        Dim objStreamReader As New StreamReader(Application.StartupPath + "\departures.xml")
        Dim departures As New Departures()
        departures = x.Deserialize(objStreamReader)
        objStreamReader.Close()


    Catch ex As Exception

    End Try
End Sub

我设置了一个断点和这一行:

  departures = x.Deserialize(objStreamReader)

告诉我离开没什么。

我错过了什么?

将您的出发时间 class 更改为:

<System.Xml.Serialization.XmlRoot("Departures")>
Public Class Departures
    Inherits List(Of Departure)
End Class

您现在尝试的将是这样的

<!-- one "Departures" for the Departures class -->
<Departures>
  <!-- one "Departures" for the Departure property-->
  <Departures>
    <Departure ... />
  </Departures>
</Departures>

还有:

  • Serialization 属性对于 XmlSerializer 没有用,它只是将 class 标记为二进制可序列化
  • XmlSerializer 只能序列化 public 属性,私有字段上的 XmlElement 属性将被忽略 - 因此您可以删除它们;默认情况下 属性 被序列化为名称等于 属性 name
  • 的元素