打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
VB.net学习笔记(二十)XML


一、XML序列化

        序列化的目的:就是为了存储或传输。


        通俗地说:序列化就是把一个完整的东西,拆成(精简)成一堆小的东西。

                            反序列化就是把一堆小东西,又复原成原来的东西。

        下例,把一个实例对象序列化,拆成一个XML。


        XML序列化要用到System.Xml.Serialization名称空间中的类和接口。

        要把对象序列化到文档或流中时,可以使用Xmlserializer类。

        

        注意下面定义时,VS出错时,可以用:

          Dim myserializer As New Xml.Serialization.XmlSerializer(GetType(FilmOrder))


  1. Imports System.Xml.Serialization '用于将对象序列化为 XML 格式文档或流的类  
  2.   
  3. Module Module1  
  4.     Sub Main()  
  5.         Dim serialize As XmlSerializer = New XmlSerializer(GetType(FilmOrder)) '指定序列化类型  
  6.         Dim myfileorder As FilmOrder = New FilmOrder("Grease", 101, 10) '指定类型的一个实例  
  7.   
  8.         serialize.Serialize(Console.Out, myfileorder) '把实例序列化到流上(console.Out)  
  9.         Console.WriteLine() '显示序列化的结果  
  10.         Console.Read()  
  11.     End Sub  
  12. End Module  
  13.   
  14. Public Class FilmOrder  
  15.     Public Name As String  
  16.     Public FileId As Integer  
  17.     Public Quantity As Integer  
  18.   
  19.     Public Sub New()  
  20.   
  21.     End Sub  
  22.   
  23.     Public Sub New(ByVal name As String, ByVal fileid As Integer, ByVal quantity As Integer)  
  24.         Me.Name = name  
  25.         Me.FileId = fileid  
  26.         Me.Quantity = quantity  
  27.     End Sub  
  28. End Class  
            运行,可以看到实例就变成了XML(注意黄框部分)


注意:  1、最后序列化生成的XML文档,其根节点与类名相同,都是FilmOrder

              2、类的每个数据成员都是XML元素。如:Name,FileId,Quantity。

              3、节点后的是架构,描述文档数据。


          上面只是序列化到标准流中,还要序列化到指定的Stream,TextWriter或XmlWriter中。

          

          



二、XML的反序列化

          与序列化相对应的是反序列化。

         前面是把对象序列化成一个XML文档。反序列化就是把XML文档来生成对象。

 

         先准备一个XML文档:Filmorama.xml

  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <FilmOrderList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.  xmlns:xsd="http://www.w3.org/2001/XMLSchema">  
  4.   <FilmOrders>  
  5.     <FilmOrder>  
  6.       <Name>Grease</Name>  
  7.       <FilmId>101</FilmId>  
  8.       <Quantity>10</Quantity>  
  9.     </FilmOrder>  
  10.     <FilmOrder>  
  11.       <Name>Lawrence of Arabia</Name>  
  12.       <FilmId>102</FilmId>  
  13.       <Quantity>10</Quantity>  
  14.     </FilmOrder>  
  15.     <FilmOrder>  
  16.       <Name>Star Wars</Name>  
  17.       <FilmId>103</FilmId>  
  18.       <Quantity>10</Quantity>  
  19.     </FilmOrder>  
  20.   </FilmOrders>  
  21. </FilmOrderList>  


       这个文档可以在解决方案中添加项,来把文档加入其中,把属性设置成如果较新则复制



由于上面FilmOrder是多个,因此,我们再设计一个类,来组装FilmOrderList,实际就是前面的类的数组形式。


  1. Imports System.Xml  
  2. Imports System.Xml.Serialization  
  3. Imports System.IO  
  4. Module Module1  
  5.     Sub Main()  
  6.         Dim dehydrated As New FileStream("Filmorama.xml", FileMode.Open)  
  7.         Dim serialize As New XmlSerializer(GetType(FilmOrderList)) '类型应明确  
  8.         Dim myfileorder As New FilmOrderList  
  9.   
  10.         myfileorder = serialize.Deserialize(dehydrated)  
  11.   
  12.         Dim singleorder As FilmOrder  
  13.         For Each singleorder In myfileorder.FilmOrders  
  14.             Console.Out.WriteLine("{0},{1},{2}", singleorder.Name, singleorder.FilmId, singleorder.Quantity)  
  15.         Next  
  16.         Console.Read()  
  17.     End Sub  
  18. End Module  
  19.   
  20. Public Class FilmOrder  
  21.     Public Name As String  
  22.     Public FilmId As Integer  
  23.     Public Quantity As Integer  
  24.   
  25.     Public Sub New()  
  26.   
  27.     End Sub  
  28.   
  29.     Public Sub New(ByVal name As String, ByVal filmid As Integer, ByVal quantity As Integer)  
  30.         Me.Name = name  
  31.         Me.FilmId = filmid  
  32.         Me.Quantity = quantity  
  33.     End Sub  
  34. End Class  
  35.   
  36. Public Class FilmOrderList  
  37.     Public FilmOrders() As FilmOrder  
  38.   
  39.     Public Sub New()  
  40.   
  41.     End Sub  
  42.   
  43.     Public Sub New(ByVal orders() As FilmOrder)  
  44.         Me.FilmOrders = orders  
  45.     End Sub  
  46. End Class  







三、源代码样式属性


如果我们生成的XML包含属性(Attibute)时,什么办?

          可以用<XMLAttribute("XXX")> 来指明对象中的数据为属性。

如果我们生成 的XML元素,要更改对象中的数据名怎么办?

          可以用<XMLElement("XXX")> 来指明对应的数据名更名为XXX



  1. Imports System.Xml  
  2. Imports System.Xml.Serialization  
  3. Imports System.IO  
  4. Module Module1  
  5.     Sub Main()  
  6.         Dim serializer As New XmlSerializer(GetType(FilmOrder))  
  7.         Dim fi As New FilmOrder("OK", 100, 100)  
  8.   
  9.         serializer.Serialize(Console.Out, fi)  
  10.         Console.Out.WriteLine()  
  11.         Console.Read()  
  12.     End Sub  
  13. End Module  
  14.   
  15. Public Class FilmOrder  
  16.     <XmlElement("Title")> Public Name As String   '序列化生成XML时,Name元素将变成Title元素  
  17.     <XmlElement("Id")> Public FilmId As Integer  
  18.     <XmlElement("Qty")> Public Quantity As Integer  
  19.   
  20.     Public Sub New()  
  21.   
  22.     End Sub  
  23.   
  24.     Public Sub New(ByVal name As String, ByVal filmid As Integer, ByVal quantity As Integer)  
  25.         Me.Name = name  
  26.         Me.FilmId = filmid  
  27.         Me.Quantity = quantity  
  28.     End Sub  
  29. End Class  






修改上面的类代码,再运行如下:










  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <MovieOrderDump>  
  3.   <FilmOrderList>  
  4.     <multiFilmOrders>  
  5.       <FilmOrder filmId="101">  
  6.         <name>Grease</name>  
  7.         <quantity>10</quantity>  
  8.       </FilmOrder>  
  9.       <FilmOrder filmId="102">  
  10.         <name>Lawrence of Arabia</name>  
  11.         <quantity>10</quantity>  
  12.       </FilmOrder>  
  13.       <FilmOrder filmId="103">  
  14.         <name>Star Wars</name>  
  15.         <quantity>10</quantity>  
  16.       </FilmOrder>  
  17.     </multiFilmOrders>  
  18.   </FilmOrderList>  
  19.    <PreOrder>  
  20.     <FilmOrder filmId="104">  
  21.       <name>Shrek III - Shrek Becomes a Programmer</name>  
  22.       <quantity>10</quantity>  
  23.     </FilmOrder>  
  24.   </PreOrder>  
  25.   <Returns>  
  26.     <FilmOrder filmId="103">  
  27.       <name>Star Wars</name>  
  28.       <quantity>2</quantity>  
  29.     </FilmOrder>  
  30.   </Returns>  
  31. </MovieOrderDump>  


  1. '遍历读整个XML  
  2. Imports System.Xml  
  3. Imports System.Xml.Serialization  
  4. Imports System.IO  
  5.   
  6. Public Class Form1  
  7.   
  8.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click  
  9.         Dim myXmlSettings As New XmlReaderSettings  
  10.   
  11.         Using readMoveInfo As XmlReader = XmlReader.Create("D:\2.xml", myXmlSettings)  
  12.             While readMoveInfo.Read() '读节点  
  13.                 ShowXmlNode(readMoveInfo)  
  14.                 While readMoveInfo.MoveToNextAttribute '逐个读该节点中的属性  
  15.                     ShowXmlNode(readMoveInfo)  
  16.                 End While  
  17.             End While  
  18.         End Using  
  19.     End Sub  
  20.   
  21.     Private Sub ShowXmlNode(ByVal reader As XmlReader) '显示  
  22.         If reader.Depth > 0 Then  
  23.             For depthCount As Integer = 0 To reader.Depth '按节点深度增加缩进  
  24.                 TextBox1.AppendText(" ")  
  25.             Next  
  26.         End If  
  27.   
  28.         If reader.NodeType = XmlNodeType.Whitespace Then  
  29.             TextBox1.AppendText("Type:" & reader.NodeType.ToString & vbCrLf)  
  30.         ElseIf reader.NodeType = XmlNodeType.Text Then  
  31.             TextBox1.AppendText("Type:" & reader.NodeType.ToString & " Value:" & reader.Value & vbCrLf)  
  32.         Else  
  33.             TextBox1.AppendText("Name:" & reader.Name & " Type:" & reader.NodeType.ToString &  
  34.                                 " AttibuteCount:" & reader.AttributeCount & " Value:" & reader.Value & vbCrLf)  
  35.         End If  
  36.     End Sub  
  37. End Class  


          运行,结果与原始XML文档对比情况如下:




  1. Dim myXmlSettings As New XmlReaderSettings  
  2. myXmlSettings.IgnoreComments = True '忽略注释  
  3. myXmlSettings.IgnoreWhitespace = True '忽略空白(因空白也会当作节点)  




  1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click  
  2.     '对已知XML遍历  
  3.     Dim myXmlSettings As New XmlReaderSettings() '读取功能(方式)设置  
  4.     Dim movieName As String  
  5.     Dim movieId As String  
  6.     Dim quantity As String  
  7.   
  8.     Using readMovieInfo As XmlReader = XmlReader.Create("D:\2.xml", myXmlSettings) '创建仅向前、非缓存的读取器实例  
  9.         readMovieInfo.Read() '当第一次创建和初始化 XmlReader 时,没有可用的信息。 必须调用 Read 读取第一个节点  
  10.         readMovieInfo.ReadStartElement("MovieOrderDump") '检查当前节点是否为元素,并将读取器推进到下一个节点  
  11.   
  12.         Do While (True)  
  13.             readMovieInfo.ReadStartElement("FilmOrderList") '检查当前内容节点是否为具有给定 Name 的元素并将读取器推进到下一个节点  
  14.             readMovieInfo.ReadStartElement("multiFilmOrders")  
  15.   
  16.             Do While (True)  
  17.                 readMovieInfo.MoveToContent() '检查当前节点是否是内容节点。否,则向前跳至下一个内容节点或文件结尾。  
  18.                 movieId = readMovieInfo.GetAttribute("filmId")  
  19.   
  20.                 readMovieInfo.ReadStartElement("FilmOrder")  
  21.                 movieName = readMovieInfo.ReadElementString  
  22.                 quantity = readMovieInfo.ReadElementString()  
  23.   
  24.   
  25.                 readMovieInfo.ReadEndElement() '读取结束标志</FilmOrder>  
  26.   
  27.                 TextBox1.AppendText(movieId & " " & movieName & " " & quantity & vbCrLf)  
  28.   
  29.                 readMovieInfo.Read() '下个FilmOrder节点  
  30.                 If (readMovieInfo.Name <> "FilmOrder") Then '否则退出  
  31.                     Exit Do  
  32.                 End If  
  33.             Loop  
  34.             readMovieInfo.ReadEndElement() '读结束标志</multiFilmOrders>,并进入下一个节点  
  35.             readMovieInfo.ReadEndElement() '读结束标志</FilmOrderList>,并进入下一个节点  
  36.             readMovieInfo.Read() '下个FilmOrderList节点  
  37.             If readMovieInfo.Name <> "FilmOrderList" Then '不是则退出  
  38.                 Exit Do  
  39.             End If  
  40.         Loop  
  41.         readMovieInfo.ReadStartElement() '</MovieOrderDump>  
  42.     End Using  
  43. End Sub  





















本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
VB.net学习笔记(二十一)XML流的读写
XmlDocument 类 (System.Xml)
VBA处理XML文件 | VBA实例教程
C#程序设计笔试题
【重要】VB.NET中的多行字符串
C#使用Linq操作Xml文件(创建xml文件、增删改查xml文件节点信息)的方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服