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 作为输入:
<?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
此实例演示如何从文件中读取 XML 数据 movies.xml。
使用以下步骤:
- 将文件 movies.xml 添加到应用程序的 bin\Debug 文件夹中。
- 在 Form.vb 文件中导入命名空间
System.Xml。 - 在表单中添加标签,并将其文本更改为 'Movies Galore'。
- 添加三个列表框和三个按钮,以显示 xml 文件中电影的标题、类型和描述。
- 使用代码编辑器窗口添加以下代码。
Imports System.XmlPublic Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load' Set the caption bar text of the form.Me.Text = "cankaoshouce.com"End SubPrivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickListBox1().Items.Clear()Dim xr As XmlReader = XmlReader.Create("movies.xml")Do While xr.Read()If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "movie" ThenListBox1.Items.Add(xr.GetAttribute(0))End IfLoopEnd SubPrivate Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.ClickListBox2().Items.Clear()Dim xr As XmlReader = XmlReader.Create("movies.xml")Do While xr.Read()If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "type" ThenListBox2.Items.Add(xr.ReadElementString)Elsexr.Read()End IfLoopEnd SubPrivate Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.ClickListBox3().Items.Clear()Dim xr As XmlReader = XmlReader.Create("movies.xml")Do While xr.Read()If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "description" ThenListBox3.Items.Add(xr.ReadElementString)Elsexr.Read()End IfLoopEnd SubEnd Class
使用 Microsoft Visual Studio 工具栏上的 开始 按钮执行并运行上述代码。单击按钮将显示文件中电影的标题、类型和描述。

XmlWriter 类用于将 XML 数据写入流、文件或 TextWriter 对象。它还以仅向前、非缓存的方式运行。
实例 2
让我们通过在运行时添加一些数据来创建一个 XML 文件。
使用以下步骤:
- 在表单中添加 WebBrowser 控件和 button 控件。
- 更改按钮的文本属性为 Show Authors 文件。
- 在代码编辑器中添加以下代码。
Imports System.XmlPublic Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load' Set the caption bar text of the form.Me.Text = "cankaoshouce.com"End SubPrivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim xws As XmlWriterSettings = New XmlWriterSettings()xws.Indent = Truexws.NewLineOnAttributes = TrueDim xw As XmlWriter = XmlWriter.Create("authors.xml", xws)xw.WriteStartDocument()xw.WriteStartElement("Authors")xw.WriteStartElement("author")xw.WriteAttributeString("code", "1")xw.WriteElementString("fname", "Zara")xw.WriteElementString("lname", "Ali")xw.WriteEndElement()xw.WriteStartElement("author")xw.WriteAttributeString("code", "2")xw.WriteElementString("fname", "Priya")xw.WriteElementString("lname", "Sharma")xw.WriteEndElement()xw.WriteStartElement("author")xw.WriteAttributeString("code", "3")xw.WriteElementString("fname", "Anshuman")xw.WriteElementString("lname", "Mohan")xw.WriteEndElement()xw.WriteStartElement("author")xw.WriteAttributeString("code", "4")xw.WriteElementString("fname", "Bibhuti")xw.WriteElementString("lname", "Banerjee")xw.WriteEndElement()xw.WriteStartElement("author")xw.WriteAttributeString("code", "5")xw.WriteElementString("fname", "Riyan")xw.WriteElementString("lname", "Sengupta")xw.WriteEndElement()xw.WriteEndElement()xw.WriteEndDocument()xw.Flush()xw.Close()WebBrowser1.Url = New Uri(AppDomain.CurrentDomain.BaseDirectory + "authors.xml")End SubEnd 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。
- 使用代码编辑器添加以下代码。
Imports System.XmlPublic Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load' Set the caption bar text of the form.Me.Text = "cankaoshouce.com"End SubPrivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickListBox1.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 = "Bikram"newAuthor.AppendChild(fn)Dim ln As XmlElement = xd.CreateElement("lname")ln.InnerText = "Seth"newAuthor.AppendChild(ln)xd.DocumentElement.AppendChild(newAuthor)Dim tr As XmlTextWriter = New XmlTextWriter("movies.xml", Nothing)tr.Formatting = Formatting.Indentedxd.WriteContentTo(tr)tr.Close()Dim nl As XmlNodeList = xd.GetElementsByTagName("fname")For Each node As XmlNode In nlListBox1.Items.Add(node.InnerText)Next nodeEnd SubEnd Class
- 使用 Microsoft Visual Studio 工具栏上的 开始 按钮执行并运行上述代码。单击 Show Author 按钮将显示所有作者的名字,包括我们在运行时添加的作者。