VB.Net XML文檔處理

可擴展標記語言(XML)是一種非常類似於HTML或SGML的標記語言。這是由萬維網聯盟推薦的,可作爲開放標準提供。

.Net Framework中的System.Xml命名空間包含用於處理XML文檔的類。以下是System.Xml命名空間中的一些常用類。

編號

類

說明

1

XmlAttribute

代表一個屬性。屬性的有效值和默認值是在文檔類型定義(DTD)或模式中定義的。

2

XmlCDataSection

代表CDATA部分。

3

XmlCharacterData

提供幾個類使用的文本操作方法。

4

XmlComment

表示XML註釋的內容。

5

XmlConvert

對XML名稱進行編碼和解碼,並提供用於在公共語言運行時類型和XML模式定義語言(XSD)類型之間進行轉換的方法。轉換數據類型時,返回的值是與區域無關的。

6

XmlDeclaration

表示XML聲明節點:<?xml version='1.0'...?>

7

XmlDictionary

實現用於優化Windows Communication Foundation(WCF)的XML讀取器/寫入器實現的字典。

8

XmlDictionaryReader

Windows Communication Foundation(WCF)從XmlReader派生的抽象類,用於執行序列化和反序列化。

9

XmlDictionaryWriter

表示Windows Communication Foundation(WCF)從XmlWriter派生的一個抽象類,用於執行序列化和反序列化。

10

XmlDocument

代表一個XML文檔。

11

XmlDocumentFragment

表示一個對樹插入操作很有用的輕量級對象。

12

XmlDocumentType

表示文檔類型聲明。

13

XmlElement

代表一個元素。

14

XmlEntity

表示一個實體聲明,如:<!ENTITY ...>。

15

XmlEntityReference

代表一個實體參考節點。

16

XmlException

返回有關最後一個異常的詳細信息。

17

XmlImplementation

定義一組XmlDocument對象的上下文。

18

XmlLinkedNode

獲取該節點之前或之後的節點。

19

XmlNode

表示XML文檔中的單個節點。

20

XmlNodeList

表示有序的節點集合。

21

XmlNodeReader

表示一個讀取器,它提供對XmlNode中XML數據的快速,非緩存向前訪問。

22

XmlNotation

代表符號聲明,例如:<!NOTATION... >

23

XmlParserContext

提供XmlReader解析XML片段所需的所有上下文信息。

24

XmlProcessingInstruction

表示處理指令,XML定義該處理指令以將特定於處理器的信息保存在文檔的文本中。

25

XmlQualifiedName

表示一個XML限定名稱。

26

XmlReader

表示一種對XML數據提供快速,非緩存,只前向訪問的讀取器。

27

XmlReaderSettings

指定一組要在Create方法創建的XmlReader對象上支持的功能。

28

XmlResolver

解析由統一資源標識符(URI)命名的外部XML資源。

29

XmlSecureResolver

通過包裝XmlResolver對象並限制底層XmlResolver可以訪問的資源來幫助確保XmlResolver的另一個實現。

30

XmlSignificantWhitespace

表示混合內容節點中的標記或xml:space= 'preserve'範圍內的空白之間的空白區域。這也被稱爲重要的空白。

31

XmlText

表示元素或屬性的文本內容。

32

XmlTextReader

表示一種提供對XML數據的快速,非緩存,只進的訪問的讀取器。

33

XmlTextWriter

表示一個寫入器,它提供了一種快速的,非緩存的,只能轉發的方式來生成包含符合W3C可擴展標記語言(XML)1.0和XML建議中命名空間的XML數據的流或文件。

34

XmlUrlResolver

解析由統一資源標識符(URI)命名的外部XML資源。

35

XmlWhitespace

表示元素內容中的空格。

36

XmlWriter

代表一個寫入器,它提供了一種快速,非緩存,只能生成包含XML數據的流或文件的方法。

37

XmlWriterSettings

指定一組要在XmlWriter.Create方法創建的XmlWriter對象上支持的功能。

XML解析器API

XML數據的兩個最基本和廣泛使用的API是:SAX和DOM接口。

  • 簡單的XML(SAX)API:在這裏,只爲感興趣的事件註冊回調,然後讓解析器繼續處理文檔。 當文檔很大或者內存有限制時,這是非常有用的,它在從磁盤讀取文件時解析文件,整個文件永遠不會存儲在內存中。
  • 文檔對象模型(DOM)API:這是萬維網聯盟的建議,其中整個文件被讀入內存並以分層(基於樹)的形式存儲以表示XML文檔的所有特徵。

當處理大文件時,SAX顯然不能像DOM那樣快速地處理信息。另一方面,單獨使用DOM要佔用大量資源,特別是在很多小文件上使用的時候。

SAX是隻讀的,而DOM允許更改XML文件。 由於這兩個不同的API相互補充,所以一般都將它們用於大型項目。

對於這裏所有的XML代碼示例,我們使用一個簡單的XML文件movies.xml作爲輸入:

<?xml version="1.0"?>

<collection shelf="New Arrivals">
<movie title="Enemy Behind">
   <type>War, Thriller</type>
   <format>DVD</format>
   <year>2003</year>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
   <type>Anime, Science Fiction</type>
   <format>DVD</format>
   <year>1989</year>
   <rating>R</rating>
   <stars>8</stars>
   <description>A schientific fiction</description>
</movie>
   <movie title="Trigun">
   <type>Anime, Action</type>
   <format>DVD</format>
   <episodes>4</episodes>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar">
   <type>Comedy</type>
   <format>VHS</format>
   <rating>PG</rating>
   <stars>2</stars>
   <description>Viewable boredom</description>
</movie>
</collection>

用SAX API解析XML

在SAX模型中,使用XmlReader和XmlWriter類來處理XML數據。XmlReader類用於以快速,只進和非緩存的方式讀取XML數據。它讀取一個XML文檔或一個流。

示例1

這個例子演示了從文件movies.xml中讀取XML數據。

  • 在應用程序的bin\Debug文件夾中添加movies.xml文件。
  • 在Form1.vb文件中導入System.Xml名稱空間。
  • 在窗體中添加一個標籤,並將其文本更改爲「電影列表」。
  • 添加三個列表框和三個按鈕,以顯示來自xml文件的電影的標題,類型和描述。

設計的效果如下 -

VB.Net

使用代碼編輯器窗口添加下面的代碼。參考代碼實現如下 -

Imports System.Xml
Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' Set the caption bar text of the form.   
        Me.Text = "SAX API讀取XML示例1 - yiibai.com"
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ListBox1().Items.Clear()
        Dim xr As XmlReader = XmlReader.Create("movies.xml")
        Do While xr.Read()
            If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "movie" Then
                ListBox1.Items.Add(xr.GetAttribute(0))
            End If
        Loop
    End Sub
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        ListBox2().Items.Clear()
        Dim xr As XmlReader = XmlReader.Create("movies.xml")
        Do While xr.Read()
            If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "type" Then
                ListBox2.Items.Add(xr.ReadElementString)
            Else
                xr.Read()
            End If
        Loop
    End Sub
    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        ListBox3().Items.Clear()
        Dim xr As XmlReader = XmlReader.Create("movies.xml")
        Do While xr.Read()
            If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "description" Then
                ListBox3.Items.Add(xr.ReadElementString)
            Else
                xr.Read()
            End If
        Loop
    End Sub
End Class

使用Microsoft Visual Studio工具欄上的「開始」按鈕執行並運行上述代碼。 點擊按鈕將顯示文件的標題,類型和電影描述。

VB.Net

分別點擊下面的幾個按鈕來加載movies.xml 文件中的對應內容 -

VB.Net

XmlWriter類用於將XML數據寫入流,文件或TextWriter對象。它也以只向前,非緩存的方式工作。

示例2

這個示例中是通過在運行時添加一些數據來創建一個XML文件。參考以下步驟:

  • 在窗體中添加一個WebBrowser控件和一個按鈕(Button)控件。
  • 將該按鈕的Text屬性更改爲顯示作者文件。

在代碼編輯器中添加下面的代碼 -

Imports System.Xml
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' Set the caption bar text of the form.   
        Me.Text = "寫入XML文件 - yiibai.com"
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim xws As XmlWriterSettings = New XmlWriterSettings()
        xws.Indent = True
        xws.NewLineOnAttributes = True
        Dim xw As XmlWriter = XmlWriter.Create("authors.xml", xws)
        xw.WriteStartDocument()
        xw.WriteStartElement("Authors")
        xw.WriteStartElement("author")
        xw.WriteAttributeString("code", "1")
        xw.WriteElementString("fname", "Su")
        xw.WriteElementString("lname", "Max")
        xw.WriteEndElement()
        xw.WriteStartElement("author")
        xw.WriteAttributeString("code", "2")
        xw.WriteElementString("fname", "Paul")
        xw.WriteElementString("lname", "Sharma")
        xw.WriteEndElement()
        xw.WriteStartElement("author")
        xw.WriteAttributeString("code", "3")
        xw.WriteElementString("fname", "Anshuman")
        xw.WriteElementString("lname", "Curry")
        xw.WriteEndElement()
        xw.WriteStartElement("author")
        xw.WriteAttributeString("code", "4")
        xw.WriteElementString("fname", "張")
        xw.WriteElementString("lname", "愛玲")
        xw.WriteEndElement()
        xw.WriteStartElement("author")
        xw.WriteAttributeString("code", "5")
        xw.WriteElementString("fname", "蘇")
        xw.WriteElementString("lname", "琴")
        xw.WriteEndElement()
        xw.WriteEndElement()
        xw.WriteEndDocument()
        xw.Flush()
        xw.Close()
        WebBrowser1.Url = New Uri(AppDomain.CurrentDomain.BaseDirectory + "authors.xml")
    End Sub
End Class

使用Microsoft Visual Studio工具欄上的「開始」按鈕執行並運行上述代碼。 單擊顯示作者文件將在Web瀏覽器上顯示新創建的authors.xml文件。運行結果如下圖所示 -

VB.Net

點擊顯示作者文件內容,看到以下結果 -

VB.Net

用DOM API解析XML

根據文檔對象模型(DOM),XML文檔由節點的節點和屬性組成。XmlDocument類用於實現.Net Framework的XML DOM解析器。 它還允許通過插入,刪除或更新文檔中的數據來修改現有的XML文檔。

以下是XmlDocument類的一些常用方法:

編號

方法

描述

1

AppendChild

將指定的節點添加到此節點的子節點列表的末尾。

2

CreateAttribute(String)

用指定的名稱創建一個XmlAttribute。

3

CreateComment

創建一個包含指定數據的XmlComment。

4

CreateDefaultAttribute

使用指定的前綴,本地名稱和名稱空間URI創建一個默認屬性。

5

CreateElement(String)

用指定的名字創建一個元素。

6

CreateNode(String, String, String)

用指定的節點類型,名稱和NamespaceURI創建一個XmlNode。

7

CreateNode(XmlNodeType, String, String)

用指定的XmlNodeType,Name和NamespaceURI創建一個XmlNode。

8

CreateNode(XmlNodeType, String, String, String)

用指定的XmlNodeType,Prefix,Name和NamespaceURI創建一個XmlNode。

9

CreateProcessingInstruction

用指定的名稱和數據創建一個XmlProcessingInstruction。

10

CreateSignificantWhitespace

創建一個XmlSignificantWhitespace節點。

11

CreateTextNode

用指定的文本創建一個XmlText。

12

CreateWhitespace

創建一個XmlWhitespace節點。

13

CreateXmlDeclaration

用指定的值創建一個XmlDeclaration節點。

14

GetElementById

獲取具有指定標識的XmlElement。

15

GetElementsByTagName(String)

返回一個XmlNodeList,其中包含與指定的Name匹配的所有子元素的列表。

16

GetElementsByTagName(String, String)

返回包含與指定的LocalName和NamespaceURI匹配的所有子元素的列表的XmlNodeList。

17

InsertAfter

在指定的參考節點之後立即插入指定的節點。

18

InsertBefore

在指定的參考節點之前立即插入指定的節點。

19

Load(Stream)

從指定的流加載XML文檔。

20

Load(String)

從指定的URL加載XML文檔。

21

Load(TextReader)

從指定的TextReader加載XML文檔。

22

Load(XmlReader)

加載指定的XmlReader中的XML文檔。

23

LoadXml

從指定的字符串加載XML文檔。

24

PrependChild

將指定的節點添加到此節點的子節點列表的開頭。

25

ReadNode

根據XmlReader中的信息創建一個XmlNode對象。讀取器必須位於節點或屬性上。

26

RemoveAll

刪除當前節點的所有子節點和/或屬性。

27

RemoveChild

刪除特定的子節點。

28

ReplaceChild

用newChild節點替換子節點oldChild。

29

Save(Stream)

將XML文檔保存到指定的流。

30

Save(String)

將XML文檔保存到指定的文件。

31

Save(TextWriter)

將XML文檔保存到指定的TextWriter。

32

Save(XmlWriter)

將XML文檔保存到指定的XmlWriter。

示例3

在這個例子中,將向xml文檔authors.xml中插入一些新節點,然後在列表框中顯示所有作者的名字。

參考以下步驟:

  • 將authors.xml 文件添加到應用程序的 bin/Debug 文件夾中(如果已經編寫上示例2,那麼應該在示例2工程中生成了)
  • 導入System.Xml名稱空間
  • 在窗體中添加一個列表框和按鈕控件,並將按鈕控件的Text屬性設置爲顯示作者。

使用代碼編輯器添加以下代碼。參考代碼實現 -

Imports System.Xml
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' Set the caption bar text of the form.   
        Me.Text = "插入XML節點 - yiibai.com"
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ListBox1.Items.Clear()
        Dim xd As XmlDocument = New XmlDocument()
        xd.Load("authors.xml")
        Dim newAuthor As XmlElement = xd.CreateElement("author")
        newAuthor.SetAttribute("code", "6")
        Dim fn As XmlElement = xd.CreateElement("fname")
        fn.InnerText = "李"
        newAuthor.AppendChild(fn)
        Dim ln As XmlElement = xd.CreateElement("lname")
        ln.InnerText = "安"
        newAuthor.AppendChild(ln)
        xd.DocumentElement.AppendChild(newAuthor)
        Dim tr As XmlTextWriter = New XmlTextWriter("movies.xml", Nothing)
        tr.Formatting = Formatting.Indented
        xd.WriteContentTo(tr)
        tr.Close()
        Dim nl As XmlNodeList = xd.GetElementsByTagName("lname")
        For Each node As XmlNode In nl
            ListBox1.Items.Add(node.InnerText)
        Next node
    End Sub
End Class

使用Microsoft Visual Studio工具欄上的「開始」按鈕執行並運行上述代碼。點擊顯示作者 按鈕將顯示所有作者的名字,包括在運行時添加的名字。

VB.Net

點擊按鈕後的效果如下所示 -

VB.Net