当前位置: 首页 > 文章教程  > 计算机与互联网 > 网络编程

4.8操作XML文件

8/31/2020 8:52:25 PM 人评论

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文件是重点内容。

相关教程

共有条评论 网友评论

验证码: 看不清楚?