如何使用多个列表反序列化表

时间:2012-10-16 04:41:45

标签: html vb.net xml-serialization

由于有多个列表,我无法反序列化此表,我知道我需要一个列表供我重复使用,但对于我的tds,因为它们也重复,问题出现在尝试阅读时tds的值,就像我以列表格式一样。

这是我的xml:

<table>
 <tr>
  <td>1</td>
  <td>2</td>
 </tr>
 <tr>
  <td>3</td>
  <td>4</td>
 </tr>
</table> 

我的班级:

Public Class table
    Private newtr As List(Of tr)
    <XmlElement()> _
    Public Property tr() As List(Of tr)
        Get
            Return newtr
        End Get
        Set(ByVal value As List(Of tr))
            newtr = value
        End Set
    End Property
End Class


Public Class tr
    Private newtd As List(Of td)
    <XmlElement()> _
    Public Property td() As List(Of td)
        Get
            Return newtd
        End Get
        Set(ByVal value As List(Of td))
            newtd = value
        End Set
    End Property
End Class


Public Class td
    Private newvalue As String
    <XmlElement()> _
    Public Property td() As String
        Get
            Return newvalue
        End Get
        Set(ByVal value As String)
            newvalue = value
        End Set
    End Property
End Class

我的代码:

Public Sub test2()
    Dim rr As New table()
    Dim xx As New XmlSerializer(rr.GetType)
    Dim objStreamReader2 As New StreamReader("table.xml")
    Dim rr2 As New table()
    rr2 = xx.Deserialize(objStreamReader2)
    For Each ii As tr In rr2.tr
        MsgBox(ii.td)
    Next
End Sub

所以关于如何获得tds中的每个值的任何想法?谢谢!

1 个答案:

答案 0 :(得分:1)

您当前将tr.td声明为列表,因此您不能将其作为单个字符串输出。您需要遍历列表中的每个td项:

For Each currTr As tr In rr2.tr
    For Each currTd As td In currTr.td
        MessageBox.Show(currTd.td)
    Next
Next

但是,这不会正确读取示例XML中的值。在您的示例中,每个td元素包含一个字符串,而不是另一个同名的子元素。但是您的数据结构假设XML的结构如下所示:

<table>
 <tr>
  <td>
   <td>1</td>
  </td>
  <td>
   <td>2</td>
  </td>
 </tr>
 <tr>
  <td>
   <td>3</td>
  </td>
  <td>
   <td>4</td>
  </td>
 </tr>
</table>

要解决这个问题,你只需要两个类:

Public Class table
    Private newtr As List(Of tr)
    <XmlElement()> _
    Public Property tr() As List(Of tr)
        Get
            Return newtr
        End Get
        Set(ByVal value As List(Of tr))
            newtr = value
        End Set
    End Property
End Class


Public Class tr
    Private newtd As List(Of String)
    <XmlElement()> _
    Public Property td() As List(Of String)
        Get
            Return newtd
        End Get
        Set(ByVal value As List(Of String))
            newtd = value
        End Set
    End Property
End Class

然后,您可以像这样遍历反序列化的对象:

For Each currTr As tr In rr2.tr
    For Each currTd As String In currTr.td
        MessageBox.Show(currTd)
    Next
Next