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模型中,使用XmlReaderXmlWriter類來處理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)

用指定的XmlNodeTypeNameNamespaceURI創建一個XmlNode

8

CreateNode(XmlNodeType, String, String, String)

用指定的XmlNodeTypePrefixNameNamespaceURI創建一個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)

返回包含與指定的LocalNameNamespaceURI匹配的所有子元素的列表的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