VB.NET還原序列化XML

來源:互聯網
上載者:User

標籤:定義   orm   encoding   結構   tin   進階編程   包含   efault   coding   

序列化,是將對象狀態轉換為可保持或傳輸的格式的過程。

與序列化相反的是還原序列化。它將流轉換為對象。這兩個過程結合起來,就能夠儲存和資料轉送。這就是序列化的意義所在。


在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 SubEnd 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 SubEnd 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 x2 As Integer, ByVal y1 As Integer, ByVal y2 As Integer)        Me.x1 = x1        Me.x2 = x2        Me.y1 = y1        Me.y2 = y2    End SubEnd 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 SubEnd Class


question類中維護了option類的對象集合。


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 x2 As Integer, ByVal y2 As Integer, ByVal y1 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 SubEnd 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 x2 As Integer, ByVal y2 As Integer, ByVal y1 As Integer, ByVal id As String)        Me.x1 = x1        Me.x2 = x2        Me.y2 = y2        Me.y1 = y1        Me.id = id    End SubEnd Class

這樣XML要還原序列化的類就建立好了。儘管說有些複雜。可是有了這些類,我們就不用一個一個地處理XML的節點了~

詳細到還原序列化的代碼。就非常easy了。代碼例如以下:

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還原序列化的過程。


xml序列化:

‘去掉xml聲明Dim settings As XmlWriterSettings = New XmlWriterSettings()settings.OmitXmlDeclaration = Truesettings.Encoding = Encoding.DefaultDim mem As System.IO.MemoryStream = New MemoryStream()Using writer As XmlWriter = XmlWriter.Create(mem, settings)‘去除預設命名空間xmlns:xsd和xmlns:xsiDim nss As XmlSerializerNamespaces = New XmlSerializerNamespaces()nss.Add("", "")Dim formatter As XmlSerializer = New XmlSerializer(wholeCardA.GetType())formatter.Serialize(writer, wholeCardA, nss)End UsingDim resultStr as string = Encoding.Default.GetString(mem.ToArray())

該方法實現了序列化xml對象及去掉xml聲明和預設命名空間。



參考文獻:Visual.Basic.2010 & NET 4 進階編程

VB.NET還原序列化XML

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.