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檔案的電影的標題,型別和描述。

設計的效果如下 -

使用程式碼編輯器視窗新增下面的程式碼。參考程式碼實現如下 -

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 - tw511.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工具列上的「開始」按鈕執行並執行上述程式碼。 點選按鈕將顯示檔案的標題,型別和電影描述。

分別點選下面的幾個按鈕來載入movies.xml 檔案中的對應內容 -

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檔案 - tw511.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檔案。執行結果如下圖所示 -

點選顯示作者檔案內容,看到以下結果 -

用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節點 - tw511.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工具列上的「開始」按鈕執行並執行上述程式碼。點選顯示作者 按鈕將顯示所有作者的名字,包括在執行時新增的名字。

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