VB.NET反序列化XML
序列化,是将对象状态转换为可保持或传输的格式的过程。 与序列化相反的是反序列化,它将流转换为对象。这两个过程结合起来,就可以存储和传输数据。这就是序列化的意义所在。
在VB.NET中转换、处理和生成XML文档时,需要用到一些XML专用名称空间中的类,这些名称空间包括: System.Xml 该名称空间提供了对各种XML标准(包括DTD、名称空间、DOM、XDR(XML Data Reduced,XML架构标准的旧版本)、XPath、XSLT和SOAP(以前表示Simple Object Access Protocol标准,现在什么也不表示))的核心支持。 System.Xml.Serialization 该名称空间提供的对象使用序列化技术进行对象与XML文档或流之间的转换。 System.Xml.Schema 该名称空间提供一组用于加载、创建和输出架构的对象,这些对象可以在内存中操作组成XML架构的各种实体 System.Xml.Xpath 该名称空间为XPath(XML Path Language)提供语法分析程序和估算引擎。 System.Xml.Xsl 该名称空间提空了使用XSL(Extensible Stylesheet Language)和XSLT(XSL Transformation)时必须用到的对象。
System.Xml.Linq 该名称空间提供了使用LINQ查询XML的支持。
今天我想讨论的是VB.NET反序列化XML。 以下是我想反序列化的XML的结构: <card> <sCodeBorder y1='34' y2='120' x2='568' x1='360' /> <border y1='0' y2='1008' x2='1650' x1='0' /> <area> <question id='1' x1='70' y1='274' x2='180' y2='288' > <option id='A' x1='70' y1='274' x2='90' y2='288' /> </question> <question id='2' x1='70' y1='298' x2='180' y2='312' > <option id='A' x1='70' y1='298' x2='90' y2='312' /> <option id='B' x1='100' y1='298' x2='120' y2='312' /> </question> <question id='3' x1='70' y1='322' x2='180' y2='336' > <option id='A' x1='70' y1='322' x2='90' y2='336' /> <option id='B' x1='100' y1='322' x2='120' y2='336' /> <option id='C' x1='130' y1='322' x2='150' y2='336' /> </question> </area> </card> 我们首先要做的是创建与XML相对应的对象,然后再把XML转换成我们想要的对象。 创建的类中需要引用System.Xml.Serialization 命名空间。这一命名空间包含用于将对象序列化为XML格式文档或流的类。 Public Class card <XmlElementAttribute("sCodeBorder")> Public sCodeBorder As sCodeBorder <XmlElementAttribute("border")> Public border As border <XmlElementAttribute("area")> Public area As area Public Sub New() End Sub Public Sub New(ByVal sCodeBorder As sCodeBorder,ByVal border As border,ByVal area As area ) Me.sCodeBorder = sCodeBorder Me.border = border Me.area = area End Sub End Class Public Class sCodeBorder <XmlAttributeAttribute("x1")> Public x1 As Integer <XmlAttributeAttribute("x2")> Public x2 As Integer <XmlAttributeAttribute("y1")> Public y1 As Integer <XmlAttributeAttribute("y2")> Public y2 As Integer Public Sub New() End Sub Public Sub New(ByVal x1 As Integer,ByVal x2 As Integer,ByVal y1 As Integer,ByVal y2 As Integer) Me.x1 = x1 Me.x2 = x2 Me.y1 = y1 Me.y2 = y2 End Sub End Class Public Class border <XmlAttributeAttribute("x1")> Public x1 As Integer <XmlAttributeAttribute("x2")> Public x2 As Integer <XmlAttributeAttribute("y1")> Public y1 As Integer <XmlAttributeAttribute("y2")> Public y2 As Integer Public Sub New() End Sub Public Sub New(ByVal x1 As Integer,ByVal y2 As Integer) Me.x1 = x1 Me.x2 = x2 Me.y1 = y1 Me.y2 = y2 End Sub End Class Public Class area <XmlElementAttribute("question")> Public Ques_List() As question Public Sub New() End Sub Public Sub New(ByVal multiQ() As question) Me.Ques_List = multiQ End Sub End Class
Public Class question <XmlAttributeAttribute("x1")> Public x1 As Integer <XmlAttributeAttribute("x2")> Public x2 As Integer <XmlAttributeAttribute("y1")> Public y1 As Integer <XmlAttributeAttribute("y2")> Public y2 As Integer <XmlAttributeAttribute("id")> Public id As String <XmlElementAttribute("option")> Public multiOptions_List() As option_ Public Sub New() End Sub Public Sub New(ByVal x1 As Integer,ByVal y2 As Integer,ByVal id As String,ByVal multiO() As option_) Me.x1 = x1 Me.x2 = x2 Me.y2 = y2 Me.y1 = y1 Me.id = id Me.multiOptions_List = multiO End Sub End Class Public Class option_ <XmlAttributeAttribute("x1")> Public x1 As Integer <XmlAttributeAttribute("x2")> Public x2 As Integer <XmlAttributeAttribute("y1")> Public y1 As Integer <XmlAttributeAttribute("y2")> Public y2 As Integer <XmlAttributeAttribute("id")> Public id As String Public Sub New() End Sub Public Sub New(ByVal x1 As Integer,ByVal id As String) Me.x1 = x1 Me.x2 = x2 Me.y2 = y2 Me.y1 = y1 Me.id = id End Sub End Class 这样XML要反序列化的类就建立好了。虽然说有些复杂,但是有了这些类,我们就不用一个一个地处理XML的节点了~ 具体到反序列化的代码,就很简单了。代码如下: Dim cardXML As FileStream = New FileStream(xmlPath,FileMode.Open) 'card是类名,也是根节点 Dim serialize As XmlSerializer = New XmlSerializer(GetType(card)) Dim wholeCard As card = serialize.Deserialize(cardXML) cardXML.Close() 上面代码的xml来源是磁盘上的文件。 但有的时候,xml是以字符串的形式给出的。这时候我们该如何处理呢? 从反序列化的定义可知,反序列化是把流转为对象。 上面的代码是以文件流的形式来反序列化。如果是字符串的话,我们就需要把字符串存入内存流中,再把内存流反序列化。 Dim descBytes() As Byte = System.Text.Encoding.Unicode.GetBytes(xmlString) Dim serialize As XmlSerializer = New XmlSerializer(GetType(card)) Dim wholeCard As card = serialize.Deserialize(New MemoryStream(descBytes)) 以上就是xml反序列化的过程。
参考文献:Visual.Basic.2010 & NET 4 高级编程 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |