可扩展标记语言(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模型中,使用XmlReader
和XmlWriter
类来处理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 - xuhuhu.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文件 - xuhuhu.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) |
用指定的XmlNodeType ,Name 和NamespaceURI 创建一个XmlNode 。 |
8 | CreateNode(XmlNodeType, String, String, String) |
用指定的XmlNodeType ,Prefix ,Name 和NamespaceURI 创建一个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) |
返回包含与指定的LocalName 和NamespaceURI 匹配的所有子元素的列表的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节点 - xuhuhu.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工具栏上的“开始”按钮执行并运行上述代码。点击显示作者 按钮将显示所有作者的名字,包括在运行时添加的名字。
点击按钮后的效果如下所示 -