4.8操作XML文件
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-38 页面XMLFile001.xml运行显示效果

图4-39 页面XMLFile002.xml运行显示效果
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源文件代码如下。

图4-40 页面StudyReadXML.aspx的设计窗口显示效果
<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-41 页面StudyReadXML.aspx运行显示效果
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源文件代码如下。

图4-42 页面StudyWriteXML.aspx设计窗口显示效果
<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-43 页面StudyWriteXML.aspx运行显示效果
(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文件是重点内容。
上一篇:4.7DataView
