以下示例使用 .NET Framework 中的 XmlDocument 类获取
items
元素中第一个
compact-disc
的艺术家姓名和标题。
using System;
using System.Xml;
public class Test{
public static void Main(string[] args){
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
XmlElement firstCD = (XmlElement) doc.DocumentElement.FirstChild;
XmlElement artist =
(XmlElement) firstCD.GetElementsByTagName("artist")[0];
XmlElement title =
(XmlElement) firstCD.GetElementsByTagName("title")[0]
Console.WriteLine("Artist={0}, Title={1}", artist.InnerText, title.InnerText);
}
}
基于游标的 API
XML 游标 API 就像在 XML 文档中移动的镜头,对准被定向的文档的各个方面。.NET Framework 中的 XPathNavigator 类就是一个 XML 游标 API。XML 游标 API 与树模型 API 相比,具有不必将整个文档加载到内存中的优势,这样便于对 XML 生成程序中按需生成文档的部分进行优化。
以下示例使用 .NET Framework 中的 XPathNavigator 类获取
items
元素中第一个
compact-disc
的艺术家姓名和标题。
using System;
using System.Xml;
using System.Xml.XPath;
public class Test{
public static void Main(string[] args){
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
XPathNavigator nav = doc.CreateNavigator();
nav.MoveToFirstChild(); //从根节点移至文档元素 (items)
nav.MoveToFirstChild(); //从 items 元素移至第一个 compact-disc 元素
//从 compact-disc 元素移至 artist 元素
nav.MoveToFirstChild();
nav.MoveToNext();
string artist = nav.value;
//从 artist 元素移至 title 元素
nav.MoveToNext();
string title = nav.value;
Console.WriteLine("Artist={0}, Title={1}", artist, title);
}
}
流式 API
使用处理 XML 的流式 API 时,用户只需在内存中存储要处理的当前节点的上下文,即可处理 XML 文档。此类 API 可以处理大型的 XML 文件,而不会占用庞大的内容空间。用于 XML 处理的流式 API 主要有两种类型:基于推进的 XML 分析器和基于拉出的 XML 分析器。
基于推进的分析器(如 SAX)的工作方式是在 XML 数据流中移动,并在遇到 XML 节点时将事件“推进”到已注册的事件处理程序(回调方法)。基于拉出的分析器(如 .NET Framework 中的 XmlReader 类)则在 XML 数据流中用作只向前的游标。
以下示例使用 .NET Framework 中的 XmlReader 类获取
items
元素中第一个
compact-disc
的艺术家姓名和标题。
using System;
using System.Xml;
public class Test{
public static void Main(string[] args){
string artist = null, title = null;
XmlTextReader reader = new XmlTextReader("test.xml");
reader.MoveToContent(); //move from root node to document element (items)
/* 保持读取,直至获得第一个 <artist> 元素 */
while(reader.Read()){
if((reader.NodeType == XmlNodeType.Element) && reader.Name.Equals("artist")){
artist = reader.ReadElementString();
title = reader.ReadElementString();
break;
}
}
Console.WriteLine("Artist={0}, Title={1}", artist, title);
}
}
XML 查询
在有些情况下,使用 API 从 XML 文档中提取信息可能会过于烦琐,这或者是由于查找数据的条件过于简略,或者是由于 API 未能呈现用于特定查询的 XML 文档的特定内容。XML 查询语言(如 XPath 1.0 和即将发布的 XQuery)都提供了从 XML 信息集中提取信息的丰富机制。
以下示例显示了如何使用 XPath 获取
items
元素中第一个
compact-disc
的艺术家姓名和标题。
using System;
using System.Xml.XPath;
public class Test{
public static void Main(string[] args){
XPathDocument doc = new XPathDocument("test.xml");
XPathNavigator nav = doc.CreateNavigator();
XPathNodeIterator iterator = nav.Select("/items/compact-disc[1]/artist | /items/compact-disc[1]/title");
iterator.MoveNext();
Console.WriteLine("Artist={0}", iterator.Current);
iterator.MoveNext();
Console.WriteLine("Title={0}", iterator.Current);
}
}
XML 转换
用户经常需要将 XML 文档从一个词汇表转换到另一个词汇表。这样做有时是为了以便于打印的格式或在 Web 浏览器中呈现文档,有时是可能需要将从外部实体接收的文档转换为较为熟悉的格式。
XSLT 是一种优秀的 XML 转换语言。XSLT 中阐述的转换说明了将源树转换为结果树的规则。转换通过关联模式和模板来完成。一个模式是一个 XPath 表达式,可以将其视为与 XML 源树的部分相匹配的正则表达式,与字符串的匹配部分相对。模式与源树中的元素进行匹配。成功匹配后,模板成为创建结果树部分的例示。在构建结果树时,可以对源树中的元素进行筛选和重新排序,还可以添加任意结构。
以下 XSLT 样式表将
items
元素转换为包含光盘信息表的 XHTML Web 页。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="xml" indent="yes"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" />
<xsl:template match="/">
<html lang="en" xml:lang="en">
<head>
<title>Order Information - ord123456</title>
</head>
<body>
<table border="1">
<tr><th>Artist</th><th>Title</th><th>Price</th></tr>
<xsl:for-each select="items/compact-disc">
<tr>
<td><xsl:value-of xmlns="" select="artist" /></td>
<td><xsl:value-of xmlns="" select="title" /></td>
<td><xsl:value-of xmlns="" select="price" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XHTML 文档由如下所示的样式表生成:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Order Information - ord123456</title>
</head>
<body>
<table border="1">
<tr>
<th>Artist</th>
<th>Title</th>
<th>Price</th>
</tr>
<tr>
<td>Nelly</td>
<td>Nellyville</td>
<td>16.95</td>
</tr>
<tr>
<td>Baby D</td>
<td>Lil Chopper Toy</td>
<td>17.55</td>
</tr>
</table>
</body>
</html>
它在 Web 浏览器中如下所示。
Artist Title Price
Nelly Nellyville 16.95
Baby D Lil Chopper Toy 17.55
小结
XML 不仅是一种描述文档的文本格式,还是一种描述结构化和半结构化数据的机制,提供了处理此类数据所需的一系列技术。像 XML 信息集等强大的提取功能将帮助我们使用 XML 技术更好地处理非文本数据,如文件系统、Windows® 注册表、关系数据库,甚至是编程语言对象。XML 使我们向实现通用的数据访问又迈进了一步。