2017-04-24 71 views
1

我想反序列化一個簡單的XML,看起來像這樣vb.net XML反序列化回報空單

<categories> 
    <category name="camera"> 
     <tags> 
      <tag name="6" value="stdy_cam"/> 
      <tag name="7" value="shaky"/> 
     </tags> 
    </category> 
    <category name="classify"> 
     <tags></tags> 
    </category> 
</categories> 

這是我的加載方法 -

Private Sub loadAllCategories() 
    Dim serializer As XmlSerializer 
    Using stream As New System.IO.FileStream("C:\temp\tags2.xml", IO.FileMode.Open) 
     serializer = New XmlSerializer(GetType(List(Of Category)), New XmlRootAttribute("categories")) 
     Me.Categories = DirectCast(serializer.Deserialize(stream), List(Of Category)) 
    End Using 
End Sub 

這些都是我的課 -

<Serializable()> 
Public Class Category 
    <XmlAttribute("name")> 
    Public Property Name As String 
    <XmlArrayItem("tag")> 
    Public Property Tags As New List(Of Tag) 
End Class 

<Serializable()> 
Public Class Tag 
    <XmlAttribute("name")> 
    Public Property Name As String 
    <XmlAttribute("value")> 
    Public Property Value As String 
End Class 

一切似乎是確定,但是當我運行程序分類列表中始終是空的。該程序不會拋出任何錯誤或異常。當我調試時,它只顯示0作爲類別的計數。我可能做錯了什麼?

回答

3

因爲您的班級名稱爲Category且您的元素爲category,小寫字母c,您在列表中獲得零。試試看:

<XmlType(TypeName:="category")> 
Public Class Category 
    <XmlAttribute("name")> 
    Public Property Name As String 
    <XmlArrayItem("tag")> 
    Public Property Tags As New List(Of Tag) 
End Class 

您還可以刪除可序列化的屬性。

編輯搞掂的標籤,以及:

<XmlType(TypeName:="category")> 
Public Class Category 
    <XmlAttribute("name")> 
    Public Property Name As String 
    <XmlArray("tags")> 
    Public Property Tags As New List(Of Tag) 
End Class 

<XmlType(TypeName:="tag")> 
Public Class Tag 
    <XmlAttribute("name")> 
    Public Property Name As String 
    <XmlAttribute("value")> 
    Public Property Value As String 
End Class 
+0

之類的工作,但不完全 - 我可以看到,現在有兩類,但標籤列表是在所有類別空!我試着用Tag類的建議 - ,但沒有運氣。 – Jay

+0

@Jay沒問題,請參閱編輯。 – JSteward

+0

啊!那工作。萬分感謝。所以,訣竅是使用XMLArray而不是XMLArrayItem? – Jay