当前位置: 首页 > 教程 > VB.Net >

VB.Net XML文档处理

精华
小牛编辑
153浏览
2023-03-14

可扩展标记语言(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 - 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工具栏上的“开始”按钮执行并运行上述代码。 点击按钮将显示文件的标题,类型和电影描述。

分别点击下面的几个按钮来加载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文件 - 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文件。运行结果如下图所示 -

点击显示作者文件内容,看到以下结果 -

用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工具栏上的“开始”按钮执行并运行上述代码。点击显示作者 按钮将显示所有作者的名字,包括在运行时添加的名字。

点击按钮后的效果如下所示 -