Visual Basic 处理 XML

Extensible Markup Language (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

Implements a dictionary used to optimize Windows Communication Foundation (WCF)'s XML reader/writer implementations。实现一个字典,用于优化 Windows Communication Foundation(WCF)的 XML 的 reader/writer 实现

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

表示一个 writer 编写器,该编写器提供了一种快速、非缓存、仅转发的方式来生成包含符合 W3C 可扩展标记语言(XML) 1.0 和 XML 建议中的名称空间的 XML 数据的流或文件。

34

XmlUrlResolver

解析由统一资源标识符(URI)命名的外部 XML 资源。

35

XmlWhitespace

表示元素内容中的空白。

36

XmlWriter

表示一个 writer 编写器,它提供了一种快速、非缓存、仅转发的方法来生成包含 XML 数据的流或文件。

37

XmlWriterSettings

指定要在 XmlWriter 创建的 XmlWriter 对象上支持的一组功能创建方法。


XML Parser API

XML 数据的两个最基本和最广泛使用的 API 是 SAX 和 DOM 接口。

  • XML 的简单 API(SAX)− 在这里,您为事件注册回调,然后让解析器遍历文档。当您的文档很大或内存有限时很有用,它会在从磁盘读取文件时解析文件,并且整个文件从不存储在内存中。
  • 文档对象模型(DOM)API— 它是万维网联盟的推荐的,其中整个文件被读入内存,并以分层(基于树)形式存储,以表示 XML 文档的所有功能。

在处理大型文件时,SAX在处理大型文件时,SAX 显然不能像 DOM 那样快速处理信息。另一方面,专门使用 DOM 确实会耗费您的资源,尤其是在许多小文件上使用时。

SAX 是只读的,而 DOM 允许更改 XML 文件。由于这两个不同的 API 实际上是相互补充的,所以可以在大型项目中同时使用它们。

对于所有 XML 代码示例,让我们使用一个简单的 XML 文件 movies.xml 作为输入:

  1. <?xml version = "1.0"?>
  2. <collection shelf = "New Arrivals">
  3. <movie title = "Enemy Behind">
  4. <type>War, Thriller</type>
  5. <format>DVD</format>
  6. <year>2003</year>
  7. <rating>PG</rating>
  8. <stars>10</stars>
  9. <description>Talk about a US-Japan war</description>
  10. </movie>
  11. <movie title = "Transformers">
  12. <type>Anime, Science Fiction</type>
  13. <format>DVD</format>
  14. <year>1989</year>
  15. <rating>R</rating>
  16. <stars>8</stars>
  17. <description>A schientific fiction</description>
  18. </movie>
  19. <movie title = "Trigun">
  20. <type>Anime, Action</type>
  21. <format>DVD</format>
  22. <episodes>4</episodes>
  23. <rating>PG</rating>
  24. <stars>10</stars>
  25. <description>Vash the Stampede!</description>
  26. </movie>
  27. <movie title = "Ishtar">
  28. <type>Comedy</type>
  29. <format>VHS</format>
  30. <rating>PG</rating>
  31. <stars>2</stars>
  32. <description>Viewable boredom</description>
  33. </movie>
  34. </collection>

使用 SAX API 解析 XML

在 SAX 模型中,您使用 XmlReaderXmlWriter 类来处理 XML 数据。

XmlReader 类用于以快速、仅向前和非缓存的方式读取 XML 数据。它读取 XML 文档或流。


实例 1

此实例演示如何从文件中读取 XML 数据 movies.xml

使用以下步骤:

  • 将文件 movies.xml 添加到应用程序的 bin\Debug 文件夹中。
  • 在 Form.vb 文件中导入命名空间 System.Xml
  • 在表单中添加标签,并将其文本更改为 'Movies Galore'。
  • 添加三个列表框和三个按钮,以显示 xml 文件中电影的标题、类型和描述。
  • 使用代码编辑器窗口添加以下代码。
  1. Imports System.Xml
  2. Public Class Form1
  3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  4. ' Set the caption bar text of the form.
  5. Me.Text = "cankaoshouce.com"
  6. End Sub
  7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  8. ListBox1().Items.Clear()
  9. Dim xr As XmlReader = XmlReader.Create("movies.xml")
  10. Do While xr.Read()
  11. If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "movie" Then
  12. ListBox1.Items.Add(xr.GetAttribute(0))
  13. End If
  14. Loop
  15. End Sub
  16. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
  17. ListBox2().Items.Clear()
  18. Dim xr As XmlReader = XmlReader.Create("movies.xml")
  19. Do While xr.Read()
  20. If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "type" Then
  21. ListBox2.Items.Add(xr.ReadElementString)
  22. Else
  23. xr.Read()
  24. End If
  25. Loop
  26. End Sub
  27. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
  28. ListBox3().Items.Clear()
  29. Dim xr As XmlReader = XmlReader.Create("movies.xml")
  30. Do While xr.Read()
  31. If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "description" Then
  32. ListBox3.Items.Add(xr.ReadElementString)
  33. Else
  34. xr.Read()
  35. End If
  36. Loop
  37. End Sub
  38. End Class

使用 Microsoft Visual Studio 工具栏上的 开始 按钮执行并运行上述代码。单击按钮将显示文件中电影的标题、类型和描述。

XmlWriter 类用于将 XML 数据写入流、文件或 TextWriter 对象。它还以仅向前、非缓存的方式运行。


实例 2

让我们通过在运行时添加一些数据来创建一个 XML 文件。

使用以下步骤:

  • 在表单中添加 WebBrowser 控件和 button 控件。
  • 更改按钮的文本属性为 Show Authors 文件。
  • 在代码编辑器中添加以下代码。
  1. Imports System.Xml
  2. Public Class Form1
  3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  4. ' Set the caption bar text of the form.
  5. Me.Text = "cankaoshouce.com"
  6. End Sub
  7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  8. Dim xws As XmlWriterSettings = New XmlWriterSettings()
  9. xws.Indent = True
  10. xws.NewLineOnAttributes = True
  11. Dim xw As XmlWriter = XmlWriter.Create("authors.xml", xws)
  12. xw.WriteStartDocument()
  13. xw.WriteStartElement("Authors")
  14. xw.WriteStartElement("author")
  15. xw.WriteAttributeString("code", "1")
  16. xw.WriteElementString("fname", "Zara")
  17. xw.WriteElementString("lname", "Ali")
  18. xw.WriteEndElement()
  19. xw.WriteStartElement("author")
  20. xw.WriteAttributeString("code", "2")
  21. xw.WriteElementString("fname", "Priya")
  22. xw.WriteElementString("lname", "Sharma")
  23. xw.WriteEndElement()
  24. xw.WriteStartElement("author")
  25. xw.WriteAttributeString("code", "3")
  26. xw.WriteElementString("fname", "Anshuman")
  27. xw.WriteElementString("lname", "Mohan")
  28. xw.WriteEndElement()
  29. xw.WriteStartElement("author")
  30. xw.WriteAttributeString("code", "4")
  31. xw.WriteElementString("fname", "Bibhuti")
  32. xw.WriteElementString("lname", "Banerjee")
  33. xw.WriteEndElement()
  34. xw.WriteStartElement("author")
  35. xw.WriteAttributeString("code", "5")
  36. xw.WriteElementString("fname", "Riyan")
  37. xw.WriteElementString("lname", "Sengupta")
  38. xw.WriteEndElement()
  39. xw.WriteEndElement()
  40. xw.WriteEndDocument()
  41. xw.Flush()
  42. xw.Close()
  43. WebBrowser1.Url = New Uri(AppDomain.CurrentDomain.BaseDirectory + "authors.xml")
  44. End Sub
  45. End Class
  • 使用 Microsoft Visual Studio 工具栏上的 开始 按钮执行并运行上述代码。单击 Show Author 文件将在 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)

使用指定的 XmlNode 类型、名称和 NamespaceURI 创建 XmlNode。

8

CreateNode(XmlNodeType, String, String, String)

使用指定的XmlNodeType、前缀、名称和 NamespaceURI 创建 XmlNode

9

CreateProcessingInstruction

使用指定的名称和数据创建 XmlProcessingInstruction。

10

CreateSignificantWhitespace

创建 XmlSignificantWhitespace 节点。

11

CreateTextNode

使用指定的文本创建 XmlText。

12

CreateWhitespace

创建 XmlWhitespace 节点。

13

CreateXmlDeclaration

使用指定的值创建 XmlDeclaration 节点。

14

GetElementById

获取具有指定 ID 的XmlElement。

15

GetElementsByTagName(String)

返回一个 XmlNodeList,其中包含与指定名称匹配的所有子元素的列表。

16

GetElementsByTagName(String, String)

返回一个 XmlNodeList,其中包含与指定的 LocalName 和 NamespaceURI 匹配的所有子元素的列表。

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

删除当前节点的所有子节点 and/or 属性。

27

RemoveChild

删除指定的子节点。

28

ReplaceChild

将子节点 oldChild 替换为 newChild 节点。

29

Save(Stream)

将 XML 文档保存到指定的流。

30

Save(String)

将 XML 文档保存到指定的文件。

31

Save(TextWriter)

将 XML 文档保存到指定的 TextWriter

32

Save(XmlWriter)

将 XML 文档保存到指定的 XmlWriter


实例 3

在本例中,让我们在 xml 文档作者中插入一些新节点。然后在列表框中显示所有作者的名字。

使用以下步骤:

  • authors.xml 文件添加到应用程序的 bin/Debug 文件夹( 如果您尝试了最后一个实例,它应该在那里)。
  • 导入 System.Xml 命名空间。
  • 在表单中添加列表框和按钮控件,并设置按钮控件的文本属性设置为 Show Authors。
  • 使用代码编辑器添加以下代码。
  1. Imports System.Xml
  2. Public Class Form1
  3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  4. ' Set the caption bar text of the form.
  5. Me.Text = "cankaoshouce.com"
  6. End Sub
  7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  8. ListBox1.Items.Clear()
  9. Dim xd As XmlDocument = New XmlDocument()
  10. xd.Load("authors.xml")
  11. Dim newAuthor As XmlElement = xd.CreateElement("author")
  12. newAuthor.SetAttribute("code", "6")
  13. Dim fn As XmlElement = xd.CreateElement("fname")
  14. fn.InnerText = "Bikram"
  15. newAuthor.AppendChild(fn)
  16. Dim ln As XmlElement = xd.CreateElement("lname")
  17. ln.InnerText = "Seth"
  18. newAuthor.AppendChild(ln)
  19. xd.DocumentElement.AppendChild(newAuthor)
  20. Dim tr As XmlTextWriter = New XmlTextWriter("movies.xml", Nothing)
  21. tr.Formatting = Formatting.Indented
  22. xd.WriteContentTo(tr)
  23. tr.Close()
  24. Dim nl As XmlNodeList = xd.GetElementsByTagName("fname")
  25. For Each node As XmlNode In nl
  26. ListBox1.Items.Add(node.InnerText)
  27. Next node
  28. End Sub
  29. End Class
  • 使用 Microsoft Visual Studio 工具栏上的 开始 按钮执行并运行上述代码。单击 Show Author 按钮将显示所有作者的名字,包括我们在运行时添加的作者。