System.Xml名称空间支持XML的处理,为了生成和浏览XML文档,使用两种访问方式:
一、读写方式
(一)基于流的方式<?xml version="1. 0" encoding="utf-8"?> <FilmOrder filmId="101”> <Name>Grease</Name> <Quantity>10</Quantity> </FilmOrder>
上面XML对应的元素及节点如下:
【元 素】 【节点】Dim FilmOrdersWriter As XmlWriter = XmlWriter.Create(“..\2.xml", myXmlSettings) ‘…….. FilmOrdersWriter.Close() Using FilmOrdersWriter As XmlWriter =XmlWriter.Create(“\2.xml", myXmlSettings) ‘…….. End Using例:创建一个XML文档(2.xml),内容如下:
<?xml version="1.0" encoding="utf-8"?> <!--Same as generated by serializing, FilmOrder--> <FilmOrder FilmId="101" Quantity="10"> <Title>Grease</Title> <Test> <clock>ok</clock> </Test> </FilmOrder>程序代码如下:
Imports System.Xml Public Class Form1 Private Sub btnCreate_Click(sender As Object, e As EventArgs) Handles btnCreate.Click Dim xmlWS As New XmlWriterSettings xmlWS.Indent = True '缩进2个字符 xmlWS.NewLineOnAttributes = True Using xmlW As XmlWriter = XmlWriter.Create(Application.StartupPath & "\2.xml", xmlWS) xmlW.WriteComment("Same as generated by serializing, FilmOrder") '写入注释 xmlW.WriteStartElement("FilmOrder") '必须先写入开始元素,与最后的WriteEndElement配套 xmlW.WriteAttributeString("FilmId", "101") xmlW.WriteAttributeString("Quantity", "10") xmlW.WriteElementString("Title", "Grease") xmlW.WriteStartElement("Test") xmlW.WriteElementString("clock", "ok") xmlW.WriteEndElement() xmlW.WriteEndElement() xmlW.Flush() '强行推入设备(文档) End Using MessageBox.Show(“完成!”) End Sub End Class(四)读取XML流
同XmlWriter一样,创建XMLReader对象前须创建XmlReaderSettings对象,以便指定在由XMLReader.Create方法创建的XmlReader对象上支持的一组功能。
然后在创建读取对象:
Dim myXmlSettings As New XmlReaderSettings () Using readMovielnfo As XmlReader = XmlReader.Create(fileName,myXmlSettings)创建后用XmlReader.Read()逐个读取节点,成功则返回True且移动到下一个节点,否则返回false。
While readMovielnfo.Read() '这里处理节点 While readMovielnfo.MoveToNextAttribute() '这里处理属性 End While End While节点的属性介绍:
<A> <B></B> <C> <D></D> </C> </A>元素<A>为根元素,其Depth为0,<B>与<C>子元素的Depth为1,<D>的Depth为2。
Imports System.Xml Public Class Form1 Private Sub btnCreate_Click(sender As Object, e As EventArgs) Handles btnCreate.Click Dim xmlWS As New XmlWriterSettings xmlWS.Indent = True '缩进2个字符 xmlWS.NewLineOnAttributes = True Using xmlW As XmlWriter = XmlWriter.Create(Application.StartupPath & "\2.xml", xmlWS) xmlW.WriteComment("Same as generated by serializing, FilmOrder") '写入注释 xmlW.WriteStartElement("FilmOrder") '必须先写入开始元素,与最后的WriteEndElement配套 xmlW.WriteAttributeString("FilmId", "101") xmlW.WriteAttributeString("Quantity", "10") xmlW.WriteElementString("Title", "Grease") xmlW.WriteStartElement("Test") xmlW.WriteElementString("clock", "ok") xmlW.WriteEndElement() xmlW.WriteEndElement() xmlW.Flush() '强行推入设备(文档) End Using MessageBox.Show(“完成!”) End Sub Private Sub btnRead_Click(sender As Object, e As EventArgs) Handles btnRead.Click Dim xmlRS As New XmlReaderSettings Dim strXml As String = "" Using xmlR As XmlReader = XmlReader.Create(Application.StartupPath & "\2.xml", xmlRS) While xmlR.Read strXml &= GetNodeInfo(xmlR) & vbCrLf While xmlR.MoveToNextAttribute strXml &= GetNodeInfo(xmlR) & vbCrLf End While End While End Using TextBox1.Text = strXml End Sub Private Function GetNodeInfo(ByVal obj As XmlReader) As String Dim strTemp As String = "" If obj.Depth > 0 Then '为了便于显示识别,每增一级下级节点,则前导加4个空格 For i As Integer = 1 To obj.Depth strTemp &= " " Next i End If If obj.NodeType = XmlNodeType.Whitespace Then Return strTemp & obj.NodeType ElseIf obj.NodeType = XmlNodeType.Text Then '文本节点无Name Return strTemp & obj.NodeType & ":" & obj.Value Else Return strTemp & obj.Name & ":" & obj.Value & "==" & obj.AttributeCount End If End Function End Class注意:
Dim xmlRS As New XmlReaderSettings Dim strXml As String = "" xmlRS.IgnoreComments = True '忽略注释 xmlRS.IgnoreWhitespace = True '忽略空白符 xmlRS.IgnoreProcessingInstructions = True '忽略处理指令
对照变化情况的图如下:
2、遍历带来的影响遍历会一股脑儿的全查找,XMLReader还有一些方法可以进行技巧处理。
检查当前节点是否是内容(非空白文本、CDATA、Element、EndElement、EntityReference 或 EndEntity)节点。
如果此节点不是内容节点,则读取器向前跳至下一个内容节点或文件结尾。它跳过以下类型的节点:
ProcessingInstruction、DocumentType、Comment、Whitespace 或 SignificantWhitespace。
XmlReader.MoveToElement 方法 ()