VB.NET中XML数组反序列化遇到问题求助
嘿,我完全懂你现在的困扰!之前我在VB.NET里做XML反序列化时,也在数组属性这儿卡了好久——明明单个类都能正常解析,一碰到数组就要么是空的,要么直接报错。
先给你说最常见的问题:你的listing()数组属性大概率缺了XML序列化特性的标注,导致.NET不知道怎么把XML里的节点映射到数组上。给你整理了修正后的类结构,你可以参考着调整:
Imports System.Xml.Serialization ' 先给根类加上XmlRoot特性,确保和XML根节点名匹配 <XmlRoot("rootobject")> Public Class rootobject Public Property response As response End Class Public Class response Public Property area_name As String Public Property bounding_box As bounding_Box Public Property country As String Public Property county As String Public Property latitude As String ' 重点在这儿!根据你的XML结构二选一: ' 情况1:XML里是 <listing><item>...</item><item>...</item></listing> 这种嵌套结构 <XmlArray("listing"), XmlArrayItem("item")> ' 括号里的名字要和你XML里的实际节点名完全一致! Public Property listing() As listing ' 情况2:XML里是直接重复的 <listing>...</listing><listing>...</listing> 节点 ' <XmlElement("listing")> ' Public Property listing() As listing ' 你的其他属性继续放在这里... End Class ' 别忘了给嵌套类也补全属性 Public Class listing ' 示例属性,替换成你实际的字段 Public Property listing_id As String Public Property description As String ' 其他属性... End Class Public Class bounding_Box Public Property min_latitude As String Public Property max_latitude As String Public Property min_longitude As String Public Property max_longitude As String ' 其他属性... End Class
然后给你一个通用的反序列化方法,你可以直接用:
Public Function DeserializeFromXml(xmlText As String) As rootobject Try Dim serializer As New XmlSerializer(GetType(rootobject)) Using stringReader As New IO.StringReader(xmlText) Return DirectCast(serializer.Deserialize(stringReader), rootobject) End Using Catch ex As Exception ' 这里可以加错误处理,比如打印异常信息排查问题 Console.WriteLine($"反序列化出错:{ex.Message}") Return Nothing End Try End Function
最后给你提几个容易踩的坑:
- 节点名称大小写敏感!XML里是
<Listing>,你特性里写"listing"肯定匹配不上 - 如果你的数组在XML里没有外层包裹节点(直接是重复的子节点),一定要用
<XmlElement>代替<XmlArray> - 所有嵌套类的属性要和XML里的字段一一对应,缺了的话反序列化后对应属性会是默认值(比如空字符串、0)
内容的提问来源于stack exchange,提问作者FraserOfSmeg
相关产品推荐
相关产品推荐

