4.8 操作XML文件
学习目标
熟悉XML文件的操作原理。掌握在ASP.NET中读、写XML文件的操作方法。
本节示例代码参考:/Code/ch04/StudyXML。
4.8.1 XML文件概述
XML在移动应用程序开发中最常见的用法,是作为与服务器端应用程序通信的数据格式。如果数据量适中,XML还可以用作本地数据存储格式,取代本地的关系数据库。使用XML存储Pocket PC设备本地数据是一个不错的选择。实际上,在许多情况下,都可能需要使用XML文件配合实现设备的本地数据存储机制。
可扩展标记语言(XML)提供一种通用的描述结构化数据的方法。与主要用于控制数据的显示和外观的HTML标记不同,XML标记主要用于定义数据本身的结构和数据类型。
XML使用一组标记来描绘数据元素。每个元素封装可能十分简单、也可能十分复杂的数据。开发人员可以定义一组无限制的XML标记。例如,可以定义一些XML标记来声明订单中的数据,如价格、税收、发货地址、账单地址等。XML是一种简单、与平台无关并被广泛采用的标准。XML相对于HTML的优点是,它将用户界面与结构化数据分隔开来。这种数据与显示的分离,使得集成来自不同源的数据成为可能。客户信息、订单、研究结果、账单付款、病历、目录数据及其他信息都可以转换为XML。
XML文件既可以包含实际数据(或内容),又可以包含标识数据的元素。XML文档具有可扩展的结构格式。接下来先给出一个简单的XML文件示例代码XMLFile001.xml。
<?xml version=“1.0”encoding=“utf-8”?> <students> <student> <id>1</id> <name>张三</name> <sex>男</sex> <city>北京</city> </student> <student> <id>2</id> <name>李四</name> <sex>男</sex> <city>上海</city> </student> <student> <id>3</id> <name>王小会</name> <sex>女</sex> <city>北京</city> </student> <course> <id>001</id> <name>语文</name> <teacher>张老师</teacher> </course> <course> <id>002</id> <name>数学</name> <teacher>李老师</teacher> </course> <course> <id>003</id> <name>英语</name> <teacher>陈老师</teacher> </course> </students>
代码解释:文档第一行是XML声明,通常只声明XML的版本信息,该行始终指示为1.0版本。encoding属性标识文档采用何种编码。下一行定义第一个文档元素students元素,第一个文档元素通常称为根元素。在students元素下面的是子元素。在这个示例中,有一个student元素集合和一个course元素集合。简单解释就可以把students当作是一个数据库名称,而其中的student元素集合和course元素集合就类似于students数据库中的两张表,而student元素中包含的其他元素就可以认为是student表的表结构,course元素类似。
不过上述代码比较累赘,于是在XML文件中可以使用属性简化上述代码,接下来给出元素和属性结合的定义XML文件示例代码XMLFile002.xml,所描述的功能和XMLFile001.xml完全等价。
<?xml version=“1.0”encoding=“utf-8”?> <students> <student id="1" name="张三" sex="男" city="北京" /> <student id="2" name="李四" sex="男" city="上海" /> <student id="3" name="王小会" sex="女" city="北京" /> <course id="001" name="语文" teacher="张老师" /> <course id="002" name="数学" teacher="李老师" /> <course id="003" name="英语" teacher="陈老师" /> </students>
很明显,XMLFile002.xml代码比XMLFile001.xml代码简洁明了了许多。主要是在XMLFile002.xml中,通过属性定义了student、course元素。属性是构造XML文档结构的基础。XML文档允许混和使用单独的元素和元素与属性的结合这两种用法,并且对大小写敏感。而且必须要有开始标记和结束标记。在浏览器中预览XMLFile001.xml、XMLFile002.xml文件显示效果分别如图4-38和图4-39所示。
4.8.2 读XML文件
在ASP.NET中,DataSet对象专门提供了两个方法来分别完成对XML文件的读取和写入操作。本小节首先讲解读取XML文件的方法和处理效果。
在前文讲过XML文件可以模拟成为是一个数据库,其中的元素可以看成是不同的表,所以使用DataSet对象把XML文件读入其中,实际上就是把XML文件中的表全部添加到DataSet对象中,同时给DataSet命名为XML文件根节点元素的名称,如XMLFile001.xml,根节点元素名称为students,那么读入DataSet中后,DataSet的名称就是students。
接下来给出一个完整的读取XML文件的示例。
(1)新建ASP.NET网站项目StudyXML,删除默认Default.aspx页面,添加页面StudyRead XML.aspx。在页面StudyReadXML.aspx的设计窗口添加两个GridView控件,页面布局如图4-40所示,页面StudyReadXML.aspx的HTML源文件代码如下。
<form id=“form1”runat=“server”> <div style="width: 200px; float:left;"> <asp:GridView ID="GridView1" runat="server"> </asp:GridView> </div> <div style="width: 200px; float:left;"> <asp:GridView ID="GridView2" runat="server"> </asp:GridView> </div> </form>
(2)直接进入StudyReadXML.aspx页面的代码窗口编写该页面Page_Load事件代码如下,这里选择读取XMLFile001.xml文件,其实读取XMLFile002.xml文件方法完全类似。
protected void Page_Load(object sender, EventArgs e) { //实例化一个DataSet对象 DataSet ds = new DataSet(); //使用DataSet对象的ReadXml方法读取XML文件,要求使用物理路径,故这里 使用//Server.MapPath("XMLFile001.xml")转换 ds.ReadXml(Server.MapPath("XMLFile001.xml")); //输出DataSet名称 Response.Write("DataSet名称:" + ds.DataSetName.ToString() + "<Br />"); Response.Write("DataSet数据集中的表的个数:" + ds.Tables.Count. ToString() + "<Br />"); //遍历DataSet的所有表 foreach (DataTable table in ds.Tables) { Response.Write("表名称:" + table.TableName + "<br />"); } //把ds中的表绑定到不同的GridView控件显示 GridView1.DataSource = ds.Tables["student"].DefaultView; GridView1.DataBind(); GridView2.DataSource = ds.Tables["course"].DefaultView; GridView2.DataBind(); }
(3)按Ctrl+F5组合键,页面的运行显示效果如图4-41所示。
4.8.3 写XML文件
在ASP.NET中,DataSet对象专门提供了两个方法来分别完成对XML文件的读取和写入操作。本小节将讲解写出XML文件的方法和处理效果。
在使用DataSet对象的WriteXML方法写出XML文件时,系统并不关注DataSet中的信息的来源,只关注当前DataSet中存在哪些表,系统会一次把当前DataSet中的所有表全部写出到一个用户指定的XML文件中。接下来从两方面构造DataSet,一方面使用数据适配器对象从数据源中获取数据表填充到DataSet(数据库脚本依然使用学习DataView控件时的studentDB),另一方面在DataSet中直接人为构造数据表。
接下来给出完整示例步骤和核心代码。
(1)在ASP.NET网站项目StudyXML中添加页面StudyWriteXML.aspx。在页面StudyWriteXML.aspx的设计窗口添加3个GridView控件,页面布局如图4-42所示,页面StudyWriteXML.aspx的HTML源文件代码如下。
<form id=“form1”runat=ldquoserver”> <div style=“width: 200px; float:left;”> <asp:GridView ID="GridView1" runat="server"> </asp:GridView> </div> <div style=“width: 200px; float:left;”> <asp:GridView ID="GridView2" runat="server"> </asp:GridView> </div> <div style=“width: 200px; float:left;”> <asp:GridView ID="GridView3" runat="server"> </asp:GridView> </div> </form>
(2)直接进入StudyWriteXML.aspx页面的代码窗口,编写该页面Page_Load事件代码如下,目的是把当前DataSet中的信息写入一个新的XML文件中,例如命名为testXML.xml。
protected void Page_Load(object sender, EventArgs e) { SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Server=DUANKEQI;User ID=sa; Password=sa;Initial Catalog=studentDB;Pooling=true;Min Pool Size=5;Max Pool Size=10; Persist Security Info=False;"; SqlDataAdapter sda = new SqlDataAdapter(); string sqlString = "select * from student order by id asc"; sda.SelectCommand = new SqlCommand(sqlString, conn); //实例化一个DataSet对象 DataSet ds = new DataSet(); //调用适配器对象的Fill方法把表信息添加到数据集ds中 sda.Fill(ds,"stu"); //定义数据表dt001的实例,名称为school DataTable dt001 = ds.Tables.Add("school"); //定义表dt001的架构(表结构) dt001.Columns.Add("id"); dt001.Columns.Add("school_name"); dt001.Columns.Add("agent"); dt001.Columns.Add("phone"); //按照dt001架构实例化一个行的对象dr DataRow dr = dt001.NewRow(); dr["id"] = "1001"; dr["school_name"] = "北京大学"; dr["agent"]= "张丽丽"; dr["phone"] = "010-55885599"; //给dt001中添加当前行 dt001.Rows.Add(dr); dr = dt001.NewRow(); dr["id"] = "1002"; dr["school_name"] = "西北大学"; dr["agent"] = "王刚"; dr["phone"] = "029-33668822"; dt001.Rows.Add(dr); DataTable dt002 = ds.Tables.Add("city"); dt002.Columns.Add("id"); dt002.Columns.Add("city_name"); dr = dt002.NewRow(); dr["id"]= "0001"; dr["city_name"] = "北京"; dt002.Rows.Add(dr); dr = dt002.NewRow(); dr["id"] = "0002"; dr["city_name"] = "西安"; dt002.Rows.Add(dr); dr = dt002.NewRow(); dr["id"] = "0003"; dr["city_name"]= "上海"; dt002.Rows.Add(dr); dr = dt002.NewRow(); dr["id"]="0004"; dr["city_name"] = "深圳"; dt002.Rows.Add(dr); //输出DataSet名称 Response.Write("DataSet名称:" + ds.DataSetName.ToString() + "<Br />"); Response.Write("DataSet数据集中的表的个数:" + ds.Tables.Count. ToString() + "<Br />"); //遍历DataSet的所有表 foreach (DataTable table in ds.Tables) { Response.Write("表名称:" + table.TableName + "<br />"); } //把DataSet中的信息写入一个新的XML文件中,例如命名为testXML.xml ds.WriteXml(Server.MapPath("testXML.xml")); //把ds中的表绑定到不同的GridView控件显示 GridView1.DataSource = ds.Tables["stu"].DefaultView; GridView1.DataBind(); GridView2.DataSource = ds.Tables["school"].DefaultView; GridView2.DataBind(); GridView3.DataSource = ds.Tables["city"].DefaultView; GridView3.DataBind(); }
(3)按Ctrl+F5组合键,首次运行显示效果如图4-43所示。
(4)运行结束后会发现网站根目录下生成了一个新的XML文件testXML.xml,就是使用“ds.WriteXml(Server.MapPath(“testXML.xml”));”完成的。下面给出testXML.xml文件的代码。
<?xml version=“1.0”standalone=“yes”?> <NewDataSet> <stu> <id>1</id> <name>张三</name> <sex>男</sex> <city>北京</city> </stu> <stu> <id>2</id> <name>王晓慧</name> <sex>女</sex> <city>上海</city> </stu> <stu> <id>3</id> <name>李志强</name> <sex>男</sex> <city>北京</city> </stu> ... <stu> <id>16</id> <name>王小丽</name> <sex>女</sex> <city>北京</city> </stu> <school> <id>1001</id> <school_name>北京大学</school_name> <agent>张丽丽</agent> <phone>010-55885599</phone> </school> <school> <id>1002</id> <school_name>西北大学</school_name> <agent>王刚</agent> <phone>029-33668822</phone> </school> <city> <id>0001</id> <city_name>北京</city_name> </city> <city> <id>0002</id> <city_name>西安</city_name> </city> <city> <id>0003</id> <city_name>上海</city_name> </city> <city> <id>0004</id> <city_name>深圳</city_name> </city> </NewDataSet>
由于创建DataSet实例时没有指定名称,所以系统给其默认名为NewDataSet,故生成的XML文件的根节点元素也命名为NewDataSet,在当前的DataSet中存在3张表stu、school、city,故生成的XML文件描述了这3张表的数据关系。
4.8.4 小结
本节介绍了使用ADO.NET核心对象DataSet操作XML文件的具体使用方法,同时对XML文件的概念、创建、使用方法做了详细介绍。使用DataSet对象的ReadXml、WriteXml方法读写XML文件是重点内容。
共有条评论 网友评论