第 5章 XML 编程
XML 文档是现在比较流行的一种文档表现形式,之所以广泛流传是因为他的结构更加
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
化。程序之间可以对 XML 数据进行规范化的操作,使应用之间可以实现数据的交互与
处理。由于 XML 文档的频繁使用,XML 编程在现今应用中的地位也越来越重要,本章通
过介绍 XML 的编程知识,使读者更好的掌握 XML 相关的技术。
5.1 .NET 框架中的 XML
对于 XML 数据的处理,.NET 框架提供了丰富的处理接口,包括编程的对象模型,以
及处理该对象模型的命名空间类库等等。本节将介绍这些 XML 的基本概念、文档对象模型
的基本概念以及 XML 包含的命名空间等知识。
5.1.1 理解 XML
XML 从简单的层面说是一种数据结构,以 XML 格式组成的文档就称之为 XML 文档。
XML 是 The Extensible Markup Language(可扩展标识语言)的简写。目前推荐遵循的是
W3C组织于2000年10月6日发布的XML1.0版本。和HTML一样,XML同样来源于SGML,
但 XML 是一种能定义对象的语言。XML 最初设计的目的是弥补 HTML 的不足,以强大的
扩展性满足网络信息发布的需要,后来逐渐用于网络数据的转换和描述。
说明: XML 由于其
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
被广泛的认可,这个语言的应用也更加广泛,如 Web 服务、文档交换格式、数
据定义模型、数据库存储类型等等。
XML 格式是通过标签来定义的。标签由包围在一个小于号(<)和一个大于号(>)之
间的文本组成,例如
。起始标签表示一个特定区域的开始,例如;结束标签定
义了一个区域的结束,除了在小于号之后紧跟着一个斜线(/)外,和起始标签基本一样,
例如 start >。
XML 数据中,包含了两部分重要的内容,及 XML 属性和 XML 元素。一个 XML 元素
由元素的开始标签起始,到元素的结束标签终止。一个元素可以拥有元素内容,这个内容
包括混合型内容、简易内容或者空内容。元素也可以拥有属性。与 HTML 类似,XML 元素
也可以在开始标签中包含属性。 属性被用于提供关于元素的附加信息。
下面的代码中,使用了元素的形式定义了一个人的对象。
female
leo
carol
上面的 XML 内容也可以定义成属性的方式,如下代码所示。
XML 的基础内容博大精深,由于篇幅限制,本书只介绍 XML 的基本定义格式和在.NET
框架中如何进行 XML 编程的内容。
5.1.2 XML 文档对象模型(DOM)
DOM 的英文意思是 XML 文档对象模型,它表示一个 XML 文档在内存中的表现形式。
之所以引入 DOM 的概念,是因为 XML 文档的处理不但包括读取和查询,还可能涉及到
XML 内容的增加、修改和删除的操作。虽然.NET 框架中提供了读取 XML 文档的类库,但
是这些类库中的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
只是用来读取文档的内容,但在内存操作中,必须通过 DOM 相关的类
库,进行文档内容的操作。
说明:在 DOM 编程模型中,最重要的两个对象是 XMLDocument 和 XMLNode。前者代表了一个 XML
对象,后者表示组成 XML 的各个节点对象,DOM 编程中提供的各个接口也就是对这两个主要的
对象进行操作。
如下面的一个 XML 文档。
leo
50.00
08/01/2007
出版社
北京 city >
该文档对应的 XML 对象模型如图 5.1 所示。
图 5.1 的 XML 对象模型
图中的每一个椭圆形节点都是一个 XMLNode 对象,在实际编程的时候,可以通过这些
XMLNode 对象进行操作,实现节点的增加、修改和删除的操作。
5.1.3 System.Xml 命名空间
System.Xml 命名空间中包含了 XML 处理相关的类、枚举以及接口等。这些对象提供
了对 XML 对象的相关操作。System.Xml 命名空间为处理 XML 提供基于标准的支持。
支持的标准包括如下:
¾ XML1.0 - http://www.w3.org/TR/1998/REC-xml-19980210 - 包括 DTD 支持。
¾ XM 命名空间 - http://www.w3.org/TR/REC-xml-names/ - 流级别和 DOM。
¾ XSD 架构 - http://www.w3.org/2001/XMLSchema
¾ XPath 表达式 - http://www.w3.org/TR/xpath
¾ XSLT 转换 - http://www.w3.org/TR/xslt
¾ DOM 级别 1 核心 - http://www.w3.org/TR/REC-DOM-Level-1/
¾ DOM 级别 2 核心 - http://www.w3.org/TR/DOM-Level-2/
System.Xml 命名空间中包括的类及说明如表 5.1 所示。
表 5.1 System.Xml命名空间中包括的类
名称 说明
NameTable 实现单线程XmlNameTable。
XmlAttribute 表示一个属性。此属性的有效值和默认值在文档类型定义(DTD)或架构中进行定
义。
XmlAttributeCollection 表示可以按名称或索引访问的属性的集合。
XmlCDataSection 表示CDATA节。
XmlCharacterData 提供多个类使用的文本操作方法。
XmlComment 表示XML注释的内容。
XmlConvert 对XML名称进行编码和解码并提供方法在公共语言类型库类型和XML架构定
义语言(XSD)类型之间进行转换。当转换数据类型时,返回的值是独立于区
域设置的。
XmlDataDocument 允许通过相关的DataSet存储、检索和操作结构化数据。
XmlDeclaration 表示XML声明节点:。
XmlDocument 表示XML文档。
XmlDocumentFragment 表示对树插入操作有用的轻量对象。
XmlDocumentType 表示文档类型声明。
XmlElement 表示一个元素。
XmlEntity 表示实体声明。
XmlEntityReference 表示实体引用节点。
XmlException 返回有关最后一个异常的详细信息。
XmlImplementation 为一组XmlDocument对象定义上下文。
XmlLinkedNode 获取紧靠该节点(之前或之后)的节点。
XmlNamedNodeMap 表示可以通过名称或索引访问的节点的集合。
XmlNamespaceManager 解析集合的命名空间、向集合添加命名空间和从集合中移除命名空间,以及提
供对这些命名空间的范围管理。
XmlNameTable 原子化字符串对象表。
XmlNode 表示XML文档中的单个节点。
XmlNodeChangedEvent
Args
提供以下事件的数据:NodeChanged、NodeChanging、NodeInserted、NodeInserting、
NodeRemoved和 NodeRemoving。
XmlNodeList 表示排序的节点集合。
XmlNodeReader 表示提供对XmlNode中的XML数据进行快速、非缓存的只进访问的读取器。
XmlNotation 表示一个表示法声明,例如 .
XmlParserContext 提供XmlReader分析XML片段所需的所有上下文信息。
XmlProcessingInstructio
n
表示一条处理指令,XML定义该处理指令以将处理器特定的信息保存在文档的
文本中。
XmlQualifiedName 表示XML限定名。
XmlReader 表示提供对XML数据进行快速、非缓存、只进访问的读取器。
XmlReaderSettings 指定在Create方法创建的XmlReader对象上支持的一组功能。
XmlResolver 解析由统一资源标识符(URI)命名的外部XML资源。
XmlSignificantWhitespac
e
表示在混合内容节点中标记之间的空白或xml:space='preserve'范围内的空白。这
也称为有效空白。
XmlText 表示元素或属性的文本内容。
XmlTextReader 表示提供对XML数据进行快速、非缓存、只进访问的读取器。
XmlTextWriter 表示提供快速、非缓存、只进方法的编写器,该方法生成包含XML数据。
XmlUrlResolver 解析由统一资源标识符(URI)命名的外部XML资源。
XmlValidatingReader 表示提供文档类型定义(DTD)、XML数据简化(XDR)架构和XML架构定义
语言(XSD)验证的读取器。
XmlWhitespace 表示元素内容中的空白。
XmlWriter 表示一个编写器,该编写器提供一种快速、非缓存和只进的方式来生成包含XML
数据的流或文件。
XmlWriterSettings 指定在由System.Xml.XmlWriter.Create方法创建的XmlWriter对象上支持的一组
功能。
System.Xml 命名空间中包括的枚举如表 5.2 所示。
表 5.2 System.Xml命名空间中包括的枚举
名称 说明
IHasXmlNode 使类可以从当前上下文或位置返回XmlNode。
IXmlLineInfo 提供一个接口,使类可以返回行和位置信息。
IXmlNamespaceResolver 提供对一组前缀和命名空间映射的只读访问。
System.Xml 命名空间中包括的接口如表 5.3 所示。
表 5.3 System.Xml命名空间中包括的接口
名称 说明
ConformanceLevel 指定已创建的XmlReader和XmlWriter对象执行的输入或输出检查的量。
EntityHandling 指定XmlTextReader或XmlValidatingReader如何处理实体。
Formatting 指定XmlTextWriter的格式设置选项。
NewLineHandling 指定如何处理分行符。
ReadState 指定读取器的状态。
ValidationType 指定要执行的验证的类型。
WhitespaceHandling 指定如何处理空白。
WriteState 指定XmlWriter的状态。
XmlDateTimeSerializationMode 指定在字符串与DateTime之间转换时,如何处理时间值。
XmlNamespaceScope 定义命名空间范围。
XmlNodeChangedAction 指定节点更改的类型。
XmlNodeOrder 描述一个节点相对于另一个节点的文档顺序。
XmlNodeType 指定节点的类型。
XmlOutputMethod 指定用于序列化XmlWriter输出的方法。
XmlSpace 指定当前xml:space范围。
XmlTokenizedType 表示字符串的XML类型。这允许以特定XML类型的形式读取字符串。
5.2 读取 XML 文档
XML 数据除了可以保存在数据库之外,还主要以文档的形式存在。.NET 中提供了相应
的接口,可以将 XML 文档中的 XML 内容读取到内存中,然后进行相应的处理。本节介绍
几种读取 XML 文档的方法,读者可以根据不同的情况使用这几个方法。
5.2.1 使用 XmlDocument 读取 XML
使用 XmlDocument 对象可以读取 XML 文件,或者一个符合 XML 文件格式的字符串。
经过相关的接口读取之后,在内存中形成一个 XmlDocument 的对象实例。
下面首先介绍如何通过 XmlDocument 实例的 Load 方法读取一个 XML 文件的内容。
例子中,需要首先获取待读取的 XML 文件,该文件的内容如下所示。
.NET 2.0 Samples
31.95
05/01/2001
【本节示例参考:\Source Code\C09\ ReadXMLFromXMLFile】
使用 XmlDocument 读取 XML 文件代码示例:Program.cs
class Program
{
static void Main(string[] args)
{
XmlDocument xml = new XmlDocument();//创建 XmlDocument 实例
xml.Load("book.xml");//从 XML 文件读取数据
Console.WriteLine("XML 文件内容是:{0}", xml.InnerXml);
Console.ReadLine();
}
}
实例的运行结果如图 5.2 所示。
图 5.2 使用 XmlDocument 读取 XML 文件实例运行结果
除了使用 Load 方法读取 XML 文件内容之外,还可以通过 LoadXml 方法读取 XML 字
符串。上面如果已经知道了 XML 字符串内容之后,还可以通过如下代码来实现读取的过程。
class Program
{
static void Main(string[] args)
{
XmlDocument xml = new XmlDocument();//创建 XmlDocument 实例
String xmlString =@”
.NET 2.0 Samples
31.95
05/01/2001
”
xml.LoadXml(xmlString);//从 XML 字符串读取数据
Console.WriteLine("XML 文件内容是:{0}", xml.InnerXml);
Console.ReadLine();
}
}
实例的运行效果同上。
5.2.2 使用 XmlReader 读取 XML
除了通过 XmlDocument 对象读取 XML 文件内容之外,还可以通过 XmlReader 以流的
方式读取 XML 文件。此接口将 XML 文件形成一个文件流,然后基于该文件流进行相关的
操作。
下面介绍如何通过XmlReader实例读取一个XML文件的内容。例子中需要读取的XML
文件同上一节 XML 文件内容。
【本节示例参考:\Source Code\C09\ UseXmlReaderReadXMLFile】
使用 XmlReader 读取 XML 文件代码示例:Program.cs
class Program
{
static void Main(string[] args)
{
using (XmlReader reader = XmlReader.Create("book.xml"))//创建 XmlReader 实例
{
reader.Read();//开始读取
reader.ReadStartElement("book");//读取 book 元素
reader.ReadStartElement("title");//读取 title 元素
Console.Write("title 元素内容: ");
Console.WriteLine(reader.ReadString());//读取元素内容
reader.ReadEndElement();//结束读取
reader.ReadStartElement("price");//读取 title 元素
Console.Write("price 元素内容: ");
Console.WriteLine(reader.ReadString());//读取元素内容
reader.ReadEndElement();//结束读取
}
using (XmlReader reader = XmlReader.Create("book.xml"))
{
while (reader.Read())
{
if (reader.IsStartElement())//判断是否是起始元素
{
if (reader.IsEmptyElement)//判断是否是空元素
Console.WriteLine("<{0}/>", reader.Name);
else
{
Console.Write("<{0}> ", reader.Name);
reader.Read(); // 读开始标签
if (reader.IsStartElement()) // 判断是否是开始元素.
Console.Write("\r\n<{0}>", reader.Name);
Console.WriteLine(reader.ReadString()); //读取元素内容
}
}
}
}
Console.ReadLine();
}
}
实例的运行结果如图 5.3 所示。
图 5.3 使用 XmlReader 读取 XML 文件实例运行结果
程序说明:
(1)实例中,通过 XmlReader.Create 方法,创建 book.xml 的 XML 字节流对象。然后
通过 ReadStartElement 方法和 ReadEndElement 方法读取指定的元素中的内容,并将其内容
显示到控制台。
(2)实例中的后半部分,通过 while 循环读取字节流对象的 XML 内容。通过
IsStartElement 判断当前读取的内容是否是元素的起始位置。通过 IsEmptyElement 属性判断
当前读取内容是否是空元素。
5.2.3 使用 XmlNode 读取节点
将 XmlDocument 读取到内存之后,可以通过 XmlNode 将所读取的 XML 对象进行分解
的操作。由于 XML 都是由 XmlNode 组成的,所以本节介绍如何基于 XmlDocument 对象获
取 XmlNode 对象的内容。
说明:XMLNode 对象是一个可以递归建立的对象,即 XMLNode 可以包含多个子 XMLNode,从而实现
复杂的 XML 嵌套结构。
下面介绍如何使用 XmlNode 读取节点。例子中需要读取的 XML 文件如下。
book 1
leo
1
24.95
book 2
leo
2
29.95
book 3
leo
3
19.95
book 4
leo
4
19.95
【本节示例参考:\Source Code\C09\ ReadXmlNode】
使用 XmlNode 读取节点代码示例:Program.cs
class Program
{
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load("bookstore.xml");
XmlNodeList nodeList;
XmlNode root = doc.DocumentElement;
nodeList = root.SelectNodes("//book");
foreach (XmlNode book in nodeList)
{
Console.WriteLine("显示 XmlNode 内容...." + book.InnerXml);
Console.WriteLine("\r\n");
}
Console.ReadLine();
}
}
实例的运行结果如图 5.4 所示。
图 5.4 使用 XmlNode 读取节点实例运行结果
程序说明:
(1)程序中首先定义了 XmlDocument 对象实例,然后调用 load 方法,获取指定文件
名的 XML 文件。
(2)通过 SelectNodes 方法,选择以 book 为根节点的节点结合,然后使用遍历的方式
将该根节点下的所有节点内容显示到控制台。
5.3 使用 XPath 检索 XML
使用.NET提供的接口读取XML文件的时候,需要按照一定的规则查询需要检索的XMl
节点,这个规则就是 XPath。
说明:XPath 通过表达式、检索范围、检索条件、运算符等来查询节点信息。
本节将介绍 XPath 中涉及到的上述内容。
5.3.1 基本 XPath 表达式
XPath 表达式使用路径表示法寻址 XML 文档的各个部分。表达式计算可以生成节点集、
布尔值、数字或字符串类型的对象。XPath 表达式使用的运算符和特殊字符如表 5.4 所示。
表 5.4 XPath表达式运算符说明
运算符 说明
/ 子运算符;选择左侧集合的直接子级。此路径运算符出现在模式开头时。
表示应从根节点选择该子级。
// 递归下降;在任意深度搜索指定元素。此路径运算符出现在模式开头时。
表示应从根节点递归下降。
. 指示当前上下文。
.. 当前上下文节点的父级。
* 通配符;选择所有元素,与元素名无关。
@ 属性;属性名的前缀。
@* 属性通配符;选择所有属性,与名称无关。
: 命名空间分隔符;将命名空间前缀与元素名或属性名分隔。
( ) 为运算分组,明确设置优先级。
+ 执行加法。
- 执行减法。
div 执行浮点除法。
* 执行乘法。
mod 从截断除法返回余数。
5.3.2 限定检索范围
在使用 XPath 查询语言的时候,需要限定检索范围,即设定查询的上下文。上下文就
是指当前指定查询的位置。表达式中包括如下 5 种上下文类型,他们分别是:
¾ 当前上下文:以句点和正斜杠(./)作为前缀的表达式明确使用当前上下文作为上下
文。如下代码表示引用当前上下文的所有 book 元素。
./ book
¾ 文档根:以正斜杠(/)为前缀的表达式使用文档树的根作为上下文。以下代码表达式
引用此文档根的 book 元素。
/book
¾ 根元素:使用正斜杠后接星号(/*)的表达式将使用根元素作为上下文。以下表达式
查找文档的根元素。
/*
¾ 递归下降:使用双正斜杠(//)的表达式指示可以包括零个或多个层次结构级别的搜
索。如果此运算符出现在模式的开头,上下文相对于文档的根。以下表达式引用当
前文档中任意位置的所有 book 元素。
//book
¾ 特定元素:以元素名开头的表达式引用特定元素的查询,从当前上下文节点开始。
下表达式引用当前上下文节点中 book 元素内的 author 元素。
book/author
5.3.3 使用函数设置检索条件
可以通过设置检索函数来简化检索的表达式的复杂程度,同时提高检索的效率。XPath
函数可以分为 4 大类,分别是:
¾ Node-Set:接受 node-set 参数,返回参数集,或返回/提供有关节点集中特定节点的
信息。
¾ String:对字符串参数执行计算、格式化和处理。
¾ Boolean:计算参数表达式,以获取布尔值结果。
¾ Number:计算参数表达式,以获取数字结果。
Node-Set 类型中包括如表 5.5 所示的函数。
表 5.5 Node-Set类型函数说明
函数名称 说明
Count 返回node-set参数中的节点数。
Id 按照唯一ID选择元素。
Last 返回的数字等于表达式计算上下文的上下文大小。
local-name 返回node-set参数中按文档顺序处于第一位的节点的扩展名称本地部分。
Name 返回的字符串包含一个QName,该QName表示node-set参数中按文档顺序处于第一位的节
点的扩展名称。
namespace-uri 返回node-set参数中按文档顺序处于第一位的节点的扩展名称的命名空间统一资源标识符。
Position 返回节点在父级中的索引号。
String 类型中包括如表 5.6 所示的函数。
表 5.6 String类型函数说明
函数名称 说明
concat 返回参数的串联。
Contains 如果第一个参数字符串包含第二个参数字符串,则返回true;否则,返回false。
normalize-space 返回去除了空白的参数字符串。
starts-with 如果第一个参数字符串以第二个参数字符串开头,则返回true;否则,返回false。
String 将对象转换为字符串。
string-length 返回字符串中的字符数。
Substring 返回第一个参数中从第二个参数指定的位置开始、第三个参数指定的长度的子字符串。
substring-after 返回第一个参数字符串中第一次出现第二个参数字符串之后的子字符串。
substring-before 返回第一个参数字符串中第一次出现第二个参数字符串之前的子字符串。
Translate 返回第一个参数字符串,出现第二个参数字符串中的字符的位置替换为第三个参数字符
串中对应位置的字符。
Boolean 类型中包括如表 5.7 所示的函数。
表 5.7 Boolean类型函数说明
函数名称 说明
Boolean 将参数转换为布尔值。
False 返回false。
Lang 如果上下文节点的xml:lang属性与参数字符串相同,则返回true。
Not 如果参数为false,则返回true,否则,返回false。
True 返回true。
Number 类型中包括如表 5.8 所示的函数。
表 5.8 Number类型函数说明
函数名称 说明
Ceiling 返回不小于参数的最小整数。
Floor 返回不大于参数的最大整数。
Number 将参数转换为数字。
Round 返回与参数最接近的整数值。
Sum 返回节点集中所有节点的总和。每个节点在求和之前先转换为数值。
5.3.4 使用运算符设置检索条件
前面表达式一节已经介绍过,运算符是构成表达式的重要部分。本节将介绍如何具体
使用运算符来设置检索条件。特定类型的元素集合可以使用路径运算符(/和//)确定。这些
运算符根据其参数的“左侧”集合进行选择,“右侧”集合表示要选择的元素。子运算符(/)
从左侧集合的直接子级中选择,而子代运算符(//)从左侧集合的任意子代中选择。因此//可以
作为一个或多个层次级别的替代。
注意:检索条件可以使用多种方式实现同一检索结果,所以读者在设计检索条件的时候,要考虑检索所
耗费的性能问题。
下面介绍几个运算符表达式的例子,然后分析这些例子具体实现的功能。
author/first-name
当前上下文节点的元素中的所有元素。
bookstore//title
元素中更深的一级或多级(任意子代)的所有元素。
bookstore/*/title
属于元素的孙级的所有元素。
bookstore//book/excerpt//emph
元素的子级中的任意位置和元素中的任意位置的所有
元素:
.//title
当前上下文中更深的一级或多级的所有元素。
@style
当前元素上下文的 style 属性。
price/@exchange
当前上下文中元素的 exchange 属性。
@my:*
my 命名空间中的所有属性。不包括 my 命名空间中的元素的未限定属性。
5.3.5 使用通配符模糊匹配
通过使用通配符(*)集合,不使用元素名即可引用元素。*集合引用作为当前上下文的子
级的所有元素,与名称无关。下面通过几个表达式示例来说明如何使用通配符。
author/*
元素的所有元素子级。
book/*/last-name
所有作为元素的孙级的元素。
*/*
当前上下文的所有孙级元素。
my:book
my 命名空间中的元素。
my:*
my 命名空间中的所有元素。
5.3.6 综合示例
下面通过一个完整的示例来介绍如何通过XPath表达式来获取各个XML文档中的节点
信息。示例中使用的 XML 文件内容如下所示。
Joe
Bob
Trenton Literary Review Honorable Mention
12
Mary
Bob
Selected Short Stories of
Mary
Bob
Britney
Bob
55
2.50
Toni
Bob
B.A.
Ph.D.
Pulitzer
Still in Trenton
Trenton Forever
6.50
It was a dark and stormy night.
But then all nights in Trenton seem dark and
stormy to someone who has gone through what
I have.
Trenton
misery
Who's Who in Trenton
Robert Bob
【本节示例参考:\Source Code\C09\ XPathSample】
XPath 综合示例代码示例:Program.cs
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load("inventory.xml");//加载 Xml 文件
string xPathString = "";
xPathString = "./author";//设定查询语句
DisplayNodeContent(doc,xPathString);
xPathString = "//author";
DisplayNodeContent(doc, xPathString);
xPathString = "author/*";
DisplayNodeContent(doc, xPathString);
xPathString = "book/*/last-name";
DisplayNodeContent(doc, xPathString);
xPathString = "*/*";
DisplayNodeContent(doc, xPathString);
xPathString = "*[@specialty]";
DisplayNodeContent(doc, xPathString);
xPathString = "@style";
DisplayNodeContent(doc, xPathString);
xPathString = "price/@exchange";
DisplayNodeContent(doc, xPathString);
xPathString = "book/@style";
DisplayNodeContent(doc, xPathString);
xPathString = "book[@style]";
DisplayNodeContent(doc, xPathString);
xPathString = "@*";
DisplayNodeContent(doc, xPathString);
xPathString = "book[last()]";
DisplayNodeContent(doc, xPathString);
xPathString = "book/author[last()]";
DisplayNodeContent(doc, xPathString);
xPathString = "author[last-name = 'Bob'] ";
DisplayNodeContent(doc, xPathString);
xPathString = "price[@intl = 'Canada']";
DisplayNodeContent(doc, xPathString);
Console.ReadLine();
}
static void DisplayNodeContent(XmlDocument doc,string xPathString)
{
//显示节点内容
XmlNodeList nodeList;
XmlNode root = doc.DocumentElement.SelectSingleNode("/bookstore");//获取根节点
nodeList = root.SelectNodes(xPathString);
Console.WriteLine("xpath 语句--{0}", xPathString);
if (nodeList.Count < 1)
{
Console.WriteLine("该语句无查询结果");
}
else
{
foreach (XmlNode book in nodeList)//遍历节点内容
{
Console.WriteLine("显示 XmlNode 内容...." + book.InnerXml);
Console.WriteLine("\r");
}
}
}
实例的运行结果如下代码所示。
xpath 语句--./author
该语句无查询结果
xpath 语句--//author
显示 XmlNode 内容....JoeBob
Trenton Literary Review Honorable Mention
显示 XmlNode 内容....MaryBobSelected Short Stories of
MaryBob
显示 XmlNode 内容....ToniBobB.A.Ph.D.Puli
tzerStill in TrentonTrenton Fore
ver
xpath 语句--author/*
该语句无查询结果
xpath 语句--book/*/last-name
显示 XmlNode 内容....Bob
显示 XmlNode 内容....Bob
显示 XmlNode 内容....Bob
显示 XmlNode 内容....Bob
xpath 语句--*/*
显示 XmlNode 内容....JoeBob<