版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第9章 在C#中使用XML,第9章 在C#中使用XML,【本章导读】 XML(可扩展标记语言)在现代程序设计中起着越来越重要的作用。.NET Framework可以在应用程序中使用XML,在C#的配置文件和源代码文档中也常使用XML。XML也可以和SOAP、Web服务、ADO.NET相互使用,达到更强的功能。 .C#中的System.Xml命名空间提供了使用XML的各种类和方法。本章介绍如何在C#中使用XmlDocument,XmlDocument是DOM的实现;如何使用XmlReader和XmlWriter类;XPath和XSLT的类实现。接着介绍XML 和 ADO.NET如何一起工作,如何
2、把其中一种格式转换为另一种格式,以及如何把对象串行化为XML,使用System.Xml.Serialization命名空间中的类从XML文档中创建一个对象。,第9章 在C#中使用XML,在C#中读写XML,2,在.NET中使用DOM,3,在C#中使用XPath和XSLT,4,9.1 XML标准简介,9.1.1 C#中支持的XML标准,XML可以被各种语言所操作,完全跨越平台,成为信息处理的重要标准之一,因此,XML的设计完全基于统一的标准进行,以保证其开放性和扩展性。,W3C (World Wide Web Consortium,万维网联盟)定义了一组XML标准,这样所有的厂商都可以依照标准进
3、行扩展与应用,使XML在软件开发中更加普及和实用。C#支持下述标准,如表9-1所示列出了标准名称及其在W3C中对应的地址。,表9-1 C#支持的XML标准及其地址,这些标准随时在随着.NET及XML的发展而改变更新,开发人员可以在W3C网站查询最新的XML标准。,9.1 XML标准简介,9.1.2 System.Xml命名空间,.NET FrameWork中的System.Xml命名空间中的类提供了对XML处理的支持。本章只介绍System.Xml命名空间中的一些比较重要的类,其中以读写类最为常用。以下为主要的XML读取器和写入器类: XmlReader:抽象的
4、读取器类,该类进行快速、没有缓存的XML数据读取。XmlReader读取方法为只向前的,有些类似SAX分析器。 XmlWriter:抽象类的写入器类,该类以流或文件的格式提供快速、没有缓存的XML数据写入。 XmlTextReader:扩展的XmlReader类,该类提供了访问XML数据的快速只向前方向的流读取。 XmlTextWriter:扩展的XmlWriter类,该类快速生成只向前的XML流。 除了XML数据读写之外,XML还包含了其他一些功能的类,以下列出了用于处理XML的其他一些重要的类: XmlNode:抽象类,该类表示XML文档中一个节点的类。XmlNode 是DOM 的.NET
5、 实现中的基类。它支持 XPath 选择并提供编辑功能。 XmlDocument:扩展XmlNode,W3C DOM的实现,给出XML文档在内存中的树形表示,可以浏览和编辑XML文档树。,9.1 XML标准简介,XmlDataDocument:扩展XmlDocument,即从XML数据中加载的文档,或从ADO.NET DataSet的关系数据中加载的文档,允许把XML和关系数据混合在同一个视图中。 XmlResolver:抽象类,分析基于XML的外部资源,例如DTD和模式引用,也可以用于处理和元素。 XmlUrlResolver:扩展XmlResolver,该类用URI(Uniform Res
6、ource Identifier,统一资源标识符)解析外部资源。 System.Xml命名空间中的有多个类均提供了管理XML文档和流的方式,而XmlDataDocument等类提供了XML数据库和存储在DataSet中的关系数据之间的读取和写入功能,.NET FrameWord提供了大量的命名空间,用于在C#中创建和读取XML文档,这些类可以在自己的C#应用程序中读取和写入XML文档,这些命名空间为: SystemXM:用于提供XML支持的命名空间。 System.XML.Schema:为W3C和Microsoft模式提供支持,该命名空间包含为 XML 架构定义语言 (XSD) 架构提供的基于
7、标准的支持该 XML 类。 System.XML.Serialization:该类对序列化对象和反序列化的XML提供支持。 System.XML.Xpath:System.Xml.XPath 命名空间包含 XPath 分析器和.net 框架的评估引擎。支持解析和计算。 System.XML.XSL:System.Xml.Xsl命名空间包含.NET Framework用于支持XSL Transform的类。,返回,9.2 在C#中读写XML,读写XML文件是C#的最基本操作,在C#中使用XmlReader 和 XmlWriter类实现XML文件的读写操作。XmlReader类是一个流模型,因此X
8、mlReader类读取XML速度快,对内存的要求不高,以向前的方式依次读取XML数据。XmlWriter的类则可生成遵循W3C的 XML 1.0 Namespace Recommendations的XML文档。 XmlReader 和 XmlWriter都是抽象类。如图9-1所示列出了派生于XmlReader 和 XmlWriter的类。,图9-1 XmlReader 和 XmlWriter的派生类,XmlTextReader 和 XmlTextWriter对xml文件进行简单的以对象形式的读取和写入操作。XmlNodeReader是将XmlNode作为数据源,而不是一个流。XmlValida
9、tingReader添加了DTD和模式验证,提供了数据的有效性验证。,9.2 在C#中读写XML,9.2.1 读取XML文件,要使用XML需要先在开发环境中引用XML组件,其中XML2.0到XML6.0可直接在应用程序中使用。在C#解决方案中添加一个MSXML6.DLL引用,就可以开始编写代码使用XML了。 以下示例将使用books.xml作为数据源。books.xml可以从Wrox网站 The Autobiography of Benjamin Franklin Benjamin Franklin 8.99 ,9.2 在C#中读写XML, The Confidence Man Herman
10、Melville 11.99 The Gorgias Plato 9.99 ,9.2 在C#中读写XML,【示例1】使用XML文件 下面代码示例使用MSXML 6.0从books.xml中加载一个带有ISDN的列表框。步骤如下: (1)打开vs2008,建立一个新C#项目。 (2)新建一个Windows窗体,该窗体包含一个列表框和一个按钮,它们都使用listBox1和button1的默认名称,button1的Text属性设置为Load XML。 (3)添加MSXML 2组建,MSXML 6是一个基于COM的组件,所以需要创建交互操作的程序集。简单的方式是在Visual Studio IDE的“
11、项目”菜单中选择“添加引用”,进入COM选项卡,选择Microsoft XML, v4.0 (或v6.0, v5.0, v3.0, v2.6)。可以把MSXML2看做在Solution Explorer中添加的命名空间。 (4)在导入COM组件时,为新程序集提供的命名空间是该COM组件的类型库名。在本例中,它就是MSXML2。如果使用TLBIMP,就可以把命名空间改为其他名称。 如果已经有了引用,所以添加如下代码: using MSXML2; (5)还需要添加一个类级的变量: private DOMDocument60 doc; (6)处理下拉列表listBox1的SelectedIndexC
12、hanged事件 现在准备在应用程序中使用MSXML。从列表框中获取ISBN,使用一个简单的XPath搜索,就可以知道匹配的书籍节点,在消息框中显示该节点的文本(书名和价格)。XML Path Language (XPath)是一种XML记号,可以用于查询和过滤XML文档中的文本。下面是在列表框中选择条目的事件处理程序代码:,9.2 在C#中读写XML,private void listBox1_SelectedIndexChanged(object sender, EventArgs e) string srch = listBox1.SelectedItem.ToString(); IXM
13、LDOMNode nd = doc.selectSingleNode( bookstore/bookISBN= + srch + ); MessageBox.Show(nd.text); (7)处理button1按钮单击事件处理程序。首先,加载books.xml文件。 【提示】本示例将books.xml放在C盘根目录中,如果books.xml没有在C盘根目录中,就需要适当地调整路径为实际保存的路径: private void button1_Click(object sender, EventArgs e) doc=new DOMDocument40 (); doc.load(c:books.
14、xml); /下面的代码声明nodes是书籍节点的一个节点列表,在本例中有3个书籍节点: IXMLDOMNodeList nodes; nodes = doc.selectNodes(bookstore/book); IXMLDOMNode node=nodes.nextNode();,9.2 在C#中读写XML,/迭代这些节点,把ISBN属性的文本值添加到listBox1中: while(node!=null) listBox1.Items.Add(node.attributes.getNamedItem(ISBN).text); node=nodes.nextNode (); ,如图9-2
15、所示是执行该示例后所得到的屏幕图,单击按钮,把数据加载到列表框中。然后选择列表框中的一项。单击下拉列表选项,弹出对话框如图9-3所示。,图9-2 XML数据加载,图9-3 XML 单击Load XML执行结果,9.2 在C#中读写XML,【示例2】读取XML数据 XmlTextReader是一种拉模型,把应用程序请求的数据拉入该应用程序,编程简单、更直观,拉模型(pull model)可以选择把什么数据传送到应用程序中。如果不需要所有的数据,就不需要处理它们。 下面的代码示例演示读取XML数据,步骤如下: (1)打开vs2008,建立一个新C#项目。 (2)新建一个Windows窗体,该窗体包
16、含一个列表框和一个按钮,它们都使用listBox1和button1的默认名称,button1的Text属性设置为Load XML。 (3)添加Xml类。 using System.Xml; (4)处理button1按钮的单击事件,添加如下代码: protected void button1_Click (object sender, System.EventArgs e) /修改访问books.xml的路径 string fileName = .books.xml; /建立一个新的TextReader对象 XmlTextReader tr = new XmlTextReader(fileNam
17、e);,9.2 在C#中读写XML,/每次读入一个节点 while(tr.Read() if(tr.NodeType = XmlNodeType.Text) listBox1.Items.Add(tr.Value); 以上代码是XmlTextReader最简单的使用方法。示例程序使用Xml文件名创建一个字符串对象和一个XmlTextReader类,使用FileName作为其参数。XmlTextReader有13种重载的构造函数版本,使用文件名、流、URL和NameTables的组合作为其参数。XmltextReader具有很强的智能性,比如当使用其读取元素或者属性多次之后,这些值会被自动存储到
18、NameTable表中,这样在下次调用相同的元素和属性名的时候即可直接从NameTable中读出,使应用程序对XML的操作速度加快。 XmlTextReader对象在初始化的时候没有当前节点,因为此时尚未对任何节点进行选择,循环执行代码tr.Read()之后,第一次执行的Read()方法会将XML文档的第一个节点读取出来,该节点通常是XML文档的说明性节点。通过比较tr.NodeType 和XmlNodeType枚举。可以找到文本节点并将其值添加到列表框。程序运行效果如图9-4所示。,9.2 在C#中读写XML,图9-4 使用 XmlTextReader类,【示例3】遍历XML文件 .Net
19、FrameWork遍历XML文档通常有以下一些方式: 使用Read()方法:该方法在打开一个XML文档后,使用Read()方法可以读取下一节点,然后使用HasValue()方法判断该节点是否有值存在,以及使用HasAttributes()方法判断是否有属性存在。 使用ReadStartElement()方法:该方法首先查看并判断当前节点中是否为起始元素,如果当前节点是起始元素,则定位到下一个节点上,如果当前节点不是起始元素,则引发一个XmlException。该方法与先调用Read ()后,然后再调用IsStartElement的方法类似。,9.2 在C#中读写XML,有两个方法可以从当前元素
20、中读取文本数据,第一个是ReadString()方法,该方法返回一个包含了XML数据的字符串对象;第二个是ReadChars()方法,该方法返回一个带有XML数据的字符串数组。 下面的示例说明了如何使用ReadElementString()。注意这个示例使用FileStream,所以需要通过using语句来包括System.IO命名空间,步骤如下: (1)打开vs2008,建立一个新C#项目。 (2)新建一个Windows窗体,该窗体包含一个列表框和一个按钮,它们都使用listBox1和button1的默认名称,button1的Text属性设置为Load XML。 (3)添加Xml类。 usi
21、ng System.Xml; (4)处理button1按钮的单击事件,添加如下代码: protected void button1_Click (object sender, System.EventArgs e) /使用文件流获取数据 FileStream fs = new FileStream(.books.xml, FileMode.Open); XmlTextReader tr = new XmlTextReader(fs); while(!tr.EOF) /如果我们单击某个元素类新型,则载入数据填充下拉列表框,9.2 在C#中读写XML,if(tr.MoveToContent() =
22、 XmlNodeType.Element 以上示例在while循环中使用MoveToContent方法查找类型为XmlNodeType.Element,且名称为title的节点,当XmlTextReader的EOF属性为真时结束循环。当程序将找到满足的ReadElementString()的结果添加到listbox列表框中。 在使用XML类时有时会发生XmlException异常,捕捉异常的方式是把ReadElementString()调用放在它自己的函数中。现在,如果在这个函数中ReadElementString()调用失败,就可以处理错误,返回给调用函数。 下面就调用这个新方法LoadLi
23、st(),把XmltextReader作为参数。进行了这些修改后,该示例如下所示:,9.2 在C#中读写XML,protected void button1_Click (object sender, System.EventArgse) /使用文件流获取数据 FileStream fs = new FileStream(.books.xml, FileMode.Open); XmlTextReader tr = new XmlTextReader(fs); while(!tr.EOF) /如果我们单击某个元素类新型,则载入数据填充下拉列表框 if(tr.MoveToContent() = X
24、mlNodeType.Element) LoadList(tr); else /其余的继续执行 tr.Read(); ,9.2 在C#中读写XML,9.2.2 写入XML文件,private void LoadList(XmlReader reader) try listBox1.Items.Add(reader.ReadElementString(); / 如果出现XML例外,则忽略继续执行. catch(XmlExceptioner) System.Xml命名空间中类具有良好的灵活性。从上面的示例代码可以看出读取XML文件有多种可能实现的方法。,.Net FrameWork的XmlText
25、Writer类可以向XML写入一个流、文件或TextWriter对象。XmlTextWriter类与XmlTextReader一样,是以只向前、不缓存的方式进行写入操作。XmlTextWriter类具有很高的可配置性,XmlTextWriter类的参数可以指定是否缩进文本、缩进量、在属性值中使用什么引号以及是否支持命名空间等信息。以下示例代码演示了XmlTextWriter类的使用,示例代码如下:,9.2 在C#中读写XML,private void button1_Click(object sender, System.EventArgs e) string fileFTEL=.bookne
26、w.xml; / 建立一个XmlTextWriter XmlTextWriter tw=new XmlTextWriter(fileFTEL,null); / 设置交叉格式 tw.Formatting=Formatting.Indented; tw.WriteStartDocument(); / 开始建立元素和属性 tw.WriteStartElement(book); tw.WriteAttributeString(genre,Mystery); tw.WriteAttributeString(publicationdate,2001); tw.WriteAttributeString(IS
27、BN,123456789); tw.WriteElementString(title,The Case of the Missing Cookie); tw.WriteStartElement(author); tw.WriteElementString(name,Cookie Monster); tw.WriteEndElement(); tw.WriteElementString(price,9.99); tw.WriteEndElement(); tw.WriteEndDocument();,9.2 在C#中读写XML,/清除并关闭对象 tw.Flush(); tw.Close(); 上
28、面的示例代码在XML文件booknew.xml中添加一本新书的数据。.NET的XmlTextWriter方法会用新XML文件重写XML旧文件。上面的示例中单击button1按钮,生成booknew.xml文件如下: The Case of the Missing Cookie Cookie Monster 9.99 ,9.2 在C#中读写XML,因为XML文档中为嵌套结构,因此在写XML文档的时候需要特别注意元素的嵌套,特别是在开始写元素和属性以及结束写元素和属性的时候。在上述示例中可以看到WriteStartElement()和 WriteEndElement()方法是如何使用并如何在输入的
29、XML文件中生成嵌套元素。 写入XML除了使用WriteElementString ()方法和 WriteAttributeString()方法外,还有其他几个用于写入XML文档的方法。比如WriteCData()、WriteComment()和WriteChars()。使用WriteCData()方法把要写入的文本作为一个参数输出一个Cdata部分();WriteComment()方法以XML格式写入注释;WriteChars()写入字符缓冲区的内容,该方法的工作方式与ReadChars()方法类似,都使用相同类型的参数,WriteChar()方法使用一个字符数组作为缓冲区,并且包含写入字符
30、串的起始位置和字符串长度。 XmlReader类和 XmlWriter类可以灵活简单的读取和写入XML文档,下一节介绍如何使用System.Xml命名空间中的XmlDocument 和 XmlNode类执行DOM。,9.3 在.NET中使用DOM,DOM 是英文Document Object Model的缩写,即“文档对象模型”,根据W3C DOM规范的定义,DOM是一种与浏览器,平台,语言无关的接口,使得程序可以访问页面其他的标准组件。DOM在.NET中的功能是通过XmlNode类来实现的。XmlNode是一个抽象类,XmlNode表示XML文档的一个节点。 另外一个实现DOM相关的是Xml
31、NodeList类,XmlNodeList类是一个节点的有序列表。这是一个动态的节点列表,程序对节点的任何修改都会立即反映到节点列表中。XmlNodeList支持索引访问和迭代访问两种方式。还有一个与DOM相关的抽象类为XmlCharacterData类,该类为XmlLinkedNode类的扩展类,为其他类提供文本处理方法。 XmlNode和XmlNodeList类组成了.NET Framework中DOM应用的核心,如表9-2所示是基于XmlNode的一些常用的类。,表9-2 基于XmlNode的类,9.3 在.NET中使用DOM,如表9-3所示中的类扩展了XmlCharacterData。
32、,表9-3 XmlCharacterData类扩展,9.3 在.NET中使用DOM,最后,如表9-4所示的类扩展了XmlLinkedNode。,表9-4 XmlLinkedNode类扩展,上面的三个表格列出了DOM的常用类及其扩展类,.NET通过这些相关的类进行任何XML的处理,实现几乎所有相关XML的操作,.NET的XML类与工具集功能强大,使用非常灵活。下面的章节将以示例的形式演示一般的DOM操作。,9.3 在.NET中使用DOM,9.3.1 使用XmlDocument对象,在.NET中提供了XmlDocument类及其派生类XmlDataDocument来表示DOM。前面章节讲述的Xml
33、Reader与XmlWriter不同,XmlDocument除了具有读写XML的功能外,还可以对DOM树进行随机的访问。 【示例1】使用XmlDocument对象显示XML数据 本示例创建一个XmlDocument对象,加载保存在磁盘上的XML文档,然后从标题元素中加载带有数据的列表框,本示例类似于XmlReader一节使用XmlReader读取XML数据的示例,区别是本例选择要使用的节点,而不是像XmlReader示例那样浏览整个文档。实现步骤如下: (1)打开vs2008,建立一个新C#项目。 (2)新建一个Windows窗体,该窗体包含一个列表框和一个按钮,它们都使用listBox1和b
34、utton1的默认名称,button1的Text属性设置为Load XML。 (3)添加Xml类。 using System.Xml; (4)首先需要在本节的示例中添加了模块级的声明: private XmlDocument doc=new XmlDocument();,9.3 在.NET中使用DOM,(5)处理button1按钮的单击事件,添加如下代码: private void button1_Click(object sender, System.EventArgs e) / 根据你的实际xml文件存储位置更改地址 doc.Load(.books.xml); / 只获取程序需要的节点 X
35、mlNodeList nodeLst=doc.GetElementsByTagName(title); / 通过XmlNodeList重申 foreach(XmlNode node in nodeLst) listBox1.Items.Add(node.InnerText); 上面的代码示例完成将XML数据加载到列表框,这使用上节所讲的XmlReader也能实现,并且使用XmlReader方面只需要浏览一次文档,而不需像上述代码循环读取节点。但是在需要重新查看某个节点的时候,就需要选择XmlDocment。,9.3 在.NET中使用DOM,(6)处理listBox1_SelectedIndex
36、Changed事件。 private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e) /建立XPath查找字符串 string srch=bookstore/booktitle= + listBox1.SelectedItem.ToString() + ; /寻找额外的数据 XmlNode foundNode = doc.SelectSingleNode(srch); if(foundNode != null) MessageBox.Show(foundNode.InnerText); else Mes
37、sageBox.Show(没有找到!); 上面的示例代码从名称为books.xml的文档中读取各个图书的节点,然后加载到列表框中进行显示,单击列表框的选项时,触发SelectedIndexChanged()事件,执行该事件后将获取所选项目的书籍名称,上面的示例代码创建了一个XPath 语句,把它传送给doc对象的SelectSingleNode() 方法,SelectSingleNode()方法返回“title”。然后在消息框中显示当前节点的InnerText。继续单击列表框中的项目时,该文档就已经被先前加载,除非到释放它之前,它都处于已加载状态。,9.3 在.NET中使用DOM,9.3.2
38、插入节点,使用XmlTextWriter方法和XmlDocument方法都可以在XML文档中写入数据,如本章前面的示例使用XmlTextWriter创建一个新XML文档,然后写入信息。但XmlTextWriter不能把节点插入到当前文档中。此时,使用XmlDocument即能把节点插入到当前文档中。 【示例2】使用XmlDocument在 XML中插入节点 (1)打开vs2008,建立一个新C#项目。 (2)新建一个Windows窗体,该窗体包含一个列表框和一个按钮,它们都使用listBox1和button1的默认名称,button1的Text属性设置为Load XML。 (3)添加Xml类。
39、 using System.Xml; (4)首先需要在本节的示例中添加了模块级的声明: private XmlDocument doc=new XmlDocument(); (5)处理button1按钮的单击事件,添加如下代码: private void button1_Click(object sender, System.EventArgs e) /根据你的组织改变xml文件路径 doc.Load(C:books.xml); /建立一个新的 book 属性,9.3 在.NET中使用DOM,XmlElement newBook = doc.CreateElement(book); /设置一些
40、属性 newBook.SetAttribute(genre, Mystery); newBook.SetAttribute(publicationdate, 2001); newBook.SetAttribute(ISBN, 123456789); /建立新的title元素 XmlElement newTitle = doc.CreateElement(title); newTitle.InnerText = The Case of the Missing Cookie; newBook.AppendChild(newTitle); /新建“author”元素 XmlElement newAu
41、thor = doc.CreateElement(author); newBook.AppendChild(newAuthor); /新建“name”元素 XmlElement newName = doc.CreateElement(name); newName.InnerText = C. Monster; newAuthor.AppendChild(newName); /新建“price”元素 XmlElement newPrice = doc.CreateElement(price); newPrice.InnerText = 9.95; newBook.AppendChild(newP
42、rice);,9.3 在.NET中使用DOM,/添加当前文档 doc.DocumentElement.AppendChild(newBook); /写doc到磁盘 XmlTextWriter tr = new XmlTextWriter(.booksEdit.xml, null); tr.Formatting = Formatting.Indented; doc.WriteContentTo(tr); tr.Close(); /将所有“titles”载入到listBox1,包括新建的 XmlNodeList nodeLst = doc.GetElementsByTagName(title);
43、foreach (XmlNode node in nodeLst) listBox1.Items.Add(node.InnerText); 运行上述代码后程序在列表框中添加了一本书名为“The Case of the Missing Cookie”的书。单击“cookie caper”这个标题,就会显示与其他标题一样的信息。程序代码首先创建一个新的book元素: XmlElement newBook = doc.CreateElement(book); 这里的CreateElement()有3个重载方法,可以指定: 元素名。 名称和命名空间URI。 前缀、本地名和命名空间。,9.3 在.NET
44、中使用DOM,使用CreateElement()创建了新的book元素后,接着为该元素添加各种属性,使用的代码为以下: newBook.SetAttribute(genre,Mystery); newBook.SetAttribute(publicationdate,2001); newBook.SetAttribute(ISBN,123456789); 使用SetAttribute()方法创建了节点的属性后,就可以添加书籍的其他元素了: XmlElement newTitle = doc.CreateElement(title); newTitle.InnerText = The Case
45、of the Missing Cookie; newBook.AppendChild(newTitle); 代码再次创建了一个新的基于XmlElement的对象“newTitle”,然后把InnerText属性设置为新书名,把该元素添加为book元素的一个子元素。对book元素中的其他元素重复这一操作。注意把name元素添加为author元素的一个子元素。这样就可以在其他book元素中得到合适的嵌套关系。 程序使用“doc.DocumentElement.AppendChild(newBook);”语句把newBook元素添加到doc.DocumentElement节点上,新增的元素与其他bo
46、ok元素同级,示例代码最后用新元素更新现有的文档,把新XML文档写到磁盘上。 在本示例中,创建了一个新的XmlTextWriter,把XmlTextWriter传送给WriteContentTo方法。WriteContentTo 方法与WriteTo方法都带一个XmlTextWriter参数。WriteContentTo是把当前节点及其所有的子节点保存到XmlTextWriter,而WriteTo只保存当前节点到XmlTextWriter。,9.3 在.NET中使用DOM,doc是一个基于XmlDocument的对象,表示整个文档,最后应使用了Save方法保存文档。Save有4个重载方法: 其
47、参数分别是一个包含文件名和路径的字符串。 基于Stream的对象。 基于TextWriter的对象。 基于XmlWriter的对象。 示例代码最后在XmlTextWriter上调用Close()方法,刷新内部缓存,并关闭XML文件。运行本示例代码时,会得到如图9-5所示的屏幕图,此时在列表框底部已经增加了一个新项。,图9-5 插入节点示例,9.3 在.NET中使用DOM,在这里XmlTextWriter和XmlDocument均能实现对XML文档的插入操作,但两者可以使用在不同的场合以发挥各自的优势。如果该XML已经准备好数据流,只需添加一个节点,那么使用XmlTextWriter比较方便快速
48、,但是如果是建立XML文档的一个部分之一,需要在XML不同的地方插入节点,则使用XmlDocument是最为恰当的。 因此,可以将下面的代码: doc.Load(c:books.xml); 调整为以下代码: /建立申明项 XmlDeclaration newDec = doc.CreateXmlDeclaration(1.0,null,null); doc.AppendChild(newDec); /建立一个新的根元素 XmlElement newRoot = doc.CreateElement(newBookstore); doc.AppendChild(newRoot); 修改后的代码首先
49、创建一个新XmlDeclaration,其参数是版本号(这里采用的是1.0)、编码(edcoding)和standalone标志。如果没有编码和标志就使用null作为参数,其中编码参数应设置为一个字符串,该字符串应是System.Text.Encoding类的一部分。当使用null时则默认为采用UTF-8编码。参数standalone标志可以是yes、no或null,如果使用的为null参数,则不使用该属性,也不包含在文档中。,9.3 在.NET中使用DOM,此时要创建的下一个元素是DocumentElement。在示例中称为newBookstore,代码的其余部分与前面的示例相同,执行的方式
50、也相同。下面是从代码中生成的booksEdit.xml文件清单: The Case of the Missing Cookie C. Monster 9.95 本节通过对XmlDocument类和基于XmlReader的类,介绍了在.net中如何操作XML文档,并且掌握不同操作类型使用的不同方法,如在需要随机访问文档时,可以使用XmlDocument类;在需要有一个流类型的模型时,可以使用基于XmlReader的类;在需要插入到当前节点时使用XmlDocument类;在希望依次写入XML文档时最好使用基于XmlWriter的类。总体说来,基于XmlDocument的XmlNode使用比较灵活,
51、但要求的内存比较多,读取文档的性能不及使用XmlReader高,所以应仔细考虑在这种情况下最好使用什么方法。,返回,9.4 在C#中使用XPath和XSLT,9.4.1 System.Xml.XPath命名空间,本节将.NET FrameWork中的XPath和XSL Transform(XSLT)一起介绍,其中XPath类属于System.Xml.XPath命名空间,XSLT类属于System.Xml.Xsl命名空间。除了XSL Transform(XSLT)能进行XSL转换,System.Xpath命名空间中的XPathNavigator类提供了在.NET中执行XSL转换的高效方式。 下面
52、小节首先介绍System.Xml.Xpath命名空间,然后介绍如何应用System.Xml.Xpath来使用System.Xml.Xsl类。,System.Xml.XPath命名空间能进行快速的XML文档迭代和选择操作,该操作是只读的,不能进行写入和修改操作。System.Xml.XPath 命名空间的XPath类能完成相关的读取、浏览等功能。 如表9-5所示列出了System.Xml.XPath命名空间中主要的类,并对每个类的功能进行了简单的说明。,表9-5 System.Xml.XPath命名空间中的类,9.4 在C#中使用XPath和XSLT,1. XpathDocument XPath
53、Document类提供了快速读取XML文档的方法,但是如果需要编辑XML,则最好选择XmlDocument,如果要与数据库进行连接和读写操作的ADO.NET,则最恰当的是选择XmlDataDocument。XPathDocument有4个重载方法: 可以从文件和路径字符串中打开XML文档。 TextReader对象中打开XML文档。 XmlReader对象中打开XML文档。 基于Stream的对象中打开XML文档。 2. XpathNavigator XpathNavigator用于在XML元素中进行导航,包含了所需移动或者选择元素的所有方法,其中的一些移动方法如表9-6所示。,9.4 在C#
54、中使用XPath和XSLT,表9-6 XpathNavigator类,9.4 在C#中使用XPath和XSLT,要在节点之间进行导航就必须先生成节点集,有三种方法可以选择生成节点集合,分别如下: Select()方法:Select()方法可以选择出要操作的节点子集,Select的参数是一个XPath表达式。 SelectAncestors() 方法:SelectAncestors() 方法返回一个XpathNodeIterator对象。XpathNodeIterator的参数是一个XPathNodeType。 SelectChildren()方法:SelectChildren()方法和Sele
55、ctAncestors()方法一样,返回一个XpathNodeIterator对象。Select的参数是一个XPath表达式,其参数也是一个XPathNodeType。 以上所有的Select方法都返回一个XPathNodeIterator对象。 3. XpathNodeIterator XPathNodeIterator可以看作是XPath中的NodeList 或NodeSet(节点列表或者节点集合),XPathNodeIterator对象有3个属性,分别如下: Clone 创建XPathNodeIterator本身的一个新副本。 Count 返回XPathNodeIterator对象中的节
56、点数。 Current返回指向当前节点的XPathNavigator。 XPathNodeIterator对象有两个方法,分别如下: CurrentPosition() 返回表示当前节点位置的一个整数。 MoveNext()移动到匹配XPath表达式的下一个节点上,然后创建一个XPathNodeIterator。,9.4 在C#中使用XPath和XSLT,【示例】使用XPath命名空间中的类 以下示例假设booksxpath.xml存放在C盘的根目录下,booksxpath.xml文件内容如下: The Autobiography of Benjamin Franklin Benjamin F
57、ranklin 8.99 The Confidence Man Herman Melville,9.4 在C#中使用XPath和XSLT, 11.99 War And Peace Leo Tolstoy Leo Tolstoy 31.00 The Gorgias Plato 9.99 ,9.4 在C#中使用XPath和XSLT,以下步骤实现使用XPath命名空间中的类的功能: (1)打开vs2008,建立一个新C#项目。 (2)新建一个Windows窗体,该窗体包含一个列表框和一个按钮,它们都使用listBox1和button1的默认名称,button1的Text属性设置为Load XML。
58、(3)添加对System.Xml.Xsl 和 System.Xml.XPath命名空间的引用,代码如下所示: using System.Xml.XPath; using System.Xml.Xsl; (4)首先需要在本节的示例中添加了模块级的声明: private XmlDocument doc=new XmlDocument(); (5)处理button1按钮的单击事件,在其Click代码中添加如下代码: 这个示例使用了文件booksxpath.xml,它类似于前面使用的books.xml,但booksxpath.xml添加了两本书。button1按钮的Click事件代码如下: priva
59、te void button1_Click(object sender, System.EventArgs e) XPathDocument doc=new XPathDocument(c:booksxpath.xml); /建立一个XPath导航 XPathNavigator nav=doc.CreateNavigator(); /建立关于书节点的XPathNodeIterator XPathNodeIterator iter=nav.Select(/bookstore/bookgenre=novel);,9.4 在C#中使用XPath和XSLT,while(iter.MoveNext() LoadBook(iter.Current); private void LoadBook(XPathNavig
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外研八下英语Unit 1 Starting out-Understanding ideas《合作探究三》课件
- (新教材)2026人教版二年级下册数学 数独游戏 教学课件
- 2026年抓娃娃机合同(1篇)
- 2025 高中信息技术数据结构在智能交通车道分配策略课件
- 专业调整项目可行性研究报告
- 龙胆草生物防治提取物中成药加工可行性研究报告
- 四川省德阳市高中2023级第二次诊断考试生物(含答案)
- 爆炸品储存应急演练实施
- 家庭春季防病安全课件
- 无人机农业应用:技术创新与实践发展
- 乡镇禁毒举报奖惩制度
- 2026年江西赣州市高三一模高考数学试卷试题(含答案详解)
- 2026年安徽工业职业技术学院单招综合素质考试题库及答案详解(全优)
- 2026年安徽新闻出版职业技术学院单招综合素质考试题库及一套答案详解
- 考古发掘与保护技术规范
- 2026年高考数学复习讲练测专题04 导数题型全归纳(题型专练)(原卷版)
- DLT 5035-2016 发电厂供暖通风与空气调节设计规范
- 部编人教版九年级历史下册全册知识点总结
- 新版北师大版小学3三年级数学下册全册教案完整(新教材)
- 矿井水综合利用分析及前景展望
- 室外消防及给水管道
评论
0/150
提交评论