以前一直搞不明白为什么要用XML这个东西,总觉的没什么用,可是后来慢慢才知道如今的WEB应用已经无法离开XML了,尽管我此刻对XML的认识依然是一知半解,但总算是知道了一些最基本的操作,今天只是讲一下对XML的基本读写操作,相信对不了解XML的朋友还是会有一点点帮助的。
在讲代码之前还是先说一下概念上的东东吧,XML是干什么用的?这是很多不了解XML的朋友都会问的一句话,由于很多地方都拿XML和HTML做比较,所以我以前也一直认为XML可能就是一种新的HTML,其实虽然都是标记语言但XML和HTML在本质上是有很大区别的,想想看,HTML这个我们都熟悉的东西,他是做什么用的?他就是一个包含了文字图像影视等对象的文件,而且经过了格式美化用来给我们阅读欣赏,HTML最主要的功能就是让人“看”,而XML不同,虽然他也能让人“看”可他更为重要的功能是用来存储数据,他能够实现关系型数据库的基本功能,能够对数据对象进行常见的添加、编辑、删除、查询。而这些是HTML所不能够实现的,所以我觉的看XML和HTML区别首先要记住这一点,而对于经常提到的“XML可随意扩展HTML不好扩展”这样的话太抽像,会让入门的人听的云里雾里的。那XML的数据管理功能没有数据库强大为什么我们要用XML存取数据而不直接用数据库?主要原因大概有两个:1、对于小量的数据而言使用XML比使用数据库性能要好,也能大量减轻数据库的负担;2、XML的兼容性,开放性,使它在所有平台上都能使用,所有WEB开发语言都能对他进行操作。因为他的种种优点使XML应用的十分广泛,比如在ASP.NET中的DataSet就是使用XML来存放数据,配置文件Web.Config也是使用XML,以方便在程序中通过API进行灵活配置。当然,要想正常的“看”一XML文件有时还需要使用XSD(设计架构)和XSL(样式语言)对XML进行一下处理,否则直接显示XML文件可读性是很差的,对于XSD和XSL的使用还不是很熟练也就不说这个了。
好了言归正传,先从XML数据读取开始。先把练习用的XML贴出来
< NewDataSet >
< Table >
< ShipperID > 1 </ ShipperID >
< CompanyName > Speedy Express </ CompanyName >
< Phone > 0086 </ Phone >
</ Table >
< Table >
< ShipperID > 2 </ ShipperID >
< CompanyName > United Package </ CompanyName >
< Phone > (503) 555-3199 </ Phone >
</ Table >
< Table >
< ShipperID > 3 </ ShipperID >
< CompanyName > Federal Shipping </ CompanyName >
< Phone > (503) 555-9931 </ Phone >
</ Table >
< Table >
< ShipperID > 4 </ ShipperID >
< CompanyName > Linag </ CompanyName >
< Phone > 8555520 </ Phone >
</ Table >
< Table >
< ShipperID > 5 </ ShipperID >
< CompanyName > Chang </ CompanyName >
< Phone > 0991 </ Phone >
</ Table >
</ NewDataSet >
在上面这个XML中NewDataSet是根节点 Table是一级节点 ShipperID,CompanyName,Phone是二级节点
1、最简单的XML数据读取方法
ds.ReadXml(Server.MapPath( " Shippers.xml " )); // 使用DataSet的ReadXml方法读取一个XML文件
GridView1.DataSource = ds.Tables[ 0 ]; // 把读出来的XML数据绑定给一个GridView来显示
GridView1.DataBind();
同样还可以使用通过DataSet的WriteXml方法把一个数据库里的表写成一个XML文件,很简单就不多说了。
2、添加一条记录
添加一条记录可以使用DataSet把XML读出来,之后在DataSet中进行NewRow的操作和对数据库操作一样,只是在添加完成后使用WriteXml方法把添加的数据保存一下就OK了,我今天要讲的是使用XmlDocument及相关类进行数据添加。
xml.Load(Server.MapPath( " Shippers.xml " )); // 用新建的对象读取我们的XML文件
XmlNode root = xml.DocumentElement; // 新建一个XML节点对象,并把我们上面建的XML对象的根节点赋给它
XmlElement xe = xml.CreateElement( " Table " ); // 新建一个元素名为Table,其实也就是新建一行的概念
XmlElement xe1 = xml.CreateElement( " ShipperID " ); // 新建一个元素名为ShipperID,其实也就是新建一列的概念
xe1.InnerText = " 5 " ; // 给新建的列赋值
// xe1.SetAttribute("test", "0");这一行是给行或列元素添加一个名为test属性,值为0的语法
xe.AppendChild(xe1); // 把新建列加到新建行中,下面两段的内容同上,又建了两个列
XmlElement xe2 = xml.CreateElement( " CompanyName " );
xe2.InnerText = " Linag " ;
xe.AppendChild(xe2);
XmlElement xe3 = xml.CreateElement( " Phone " );
xe3.InnerText = " 0991 " ;
xe.AppendChild(xe3);
root.AppendChild(xe); // 把新建的行添加到根节点上
xml.Save(Server.MapPath( " Shippers.xml " )); // 存盘
3、编辑数据
同样可以使用DataSet进行编辑,我们还是讲使用XmlDocument来编辑,使用两个循环在XML文件中查找名为Phone且值为0991的节点,找到后进行修改
xml.Load(Server.MapPath( " Shippers.xml " ));
XmlNodeList xnl = xml.DocumentElement.ChildNodes; // 新建一个节点列表对象,把读取的XML文件根节点下的所有子节点赋给它
XmlNodeList xnl_child; // 再建一个节点列表对象,后面用
XmlElement xe;
for ( int i = 0 ; i < xnl.Count; i ++ ) // 第一个循环对根节点下的一级子节点进行访问
... {
xnl_child = xnl.Item(i).ChildNodes; //把访问到的一级节点所包含的子节点赋给前面建的节点列表
for (int x = 0; x < xnl_child.Count; x++)//第二个循环对一级节点下的二级节点进行访问
...{
xe = (XmlElement)xnl_child.Item(x);//把访问到的二级节点转换成元素对象
if (xe.Name == "Phone" && xe.InnerText == "0991")//如果这个元素的名称和内容是我们要找的
...{
xe.InnerText = "8800";//就进行内容修改
xml.Save(Server.MapPath("Shippers.xml"));
Response.Write("记录编辑完成!");
return;
}
}
}
Response.Write( " 没有找到符合的记录! " );
4、删除数据
删除数据和编辑数据一样,只有一句代码不同
xml.Load(Server.MapPath( " Shippers.xml " ));
XmlNodeList xnl = xml.DocumentElement.ChildNodes;
XmlNodeList xnl_child;
XmlElement xe;
for ( int i = 0 ; i < xnl.Count; i ++ )
... {
xnl_child = xnl.Item(i).ChildNodes;
for (int x = 0; x < xnl_child.Count; x++)
...{
xe = (XmlElement)xnl_child.Item(x);
if (xe.Name == "Phone" && xe.InnerText == "0991")
...{
xml.DocumentElement.RemoveChild(xnl.Item(i));//这里把编辑改成删除就行了,注意删除语法:把XML根节点(DocumentElement)下的一级节点(xnl.Item(i))删除掉。
xml.Save(Server.MapPath("Shippers.xml"));
Response.Write("指定记录已删除!");
return;
}
}
}
Response.Write( " 没有找到符合的记录! " );
5、使用Xpath进行查找
上面编辑和删除时,我们为了查找到我们要求的数据使用了两个循环,其实我们完全可以使用Xpath来进行查找我们想要的数据条件,Xpath很像SQL中的Select语句,他的功能也是比较复杂的,光函数就有一百多个,http://www.w3pop.com/tech/school/xpath/xpath_syntax.asp这个网站有对Xpath语法的详细列表。我在这里只举个简单的例子来说明一下它的用法。比如我们要查找电话为0991的公司名称:
xml.Load(Server.MapPath( " Shippers.xml " ));
XmlElement xe = (XmlElement)xml.SelectSingleNode( " //Table[Phone='0991']/CompanyName " ); // 关键在这里
Response.Write(xe.InnerText);
首先我们要使用XmlDocument类里的SelectSingleNode方法进行查询:
"//Table[Phone='0991']/CompanyName"
上面这句引号里的内容就是Xpath查询语句,它的结构与DOS下的文件系统(例如:C:/winows/System/win.com)十分相似,在查询语句里可以使用通配符,运算符,函数等复杂的表达式,这不是一两句能说清楚的,在我上面提供的网站里有说明,大家好好看看吧。另外,我在上面使用的是SelectSingleNode方法,这个方法顾名思义只能返回一个查询结果,如果要返回多个查询结果比如把电话为0991的一行数据全部返回:
xml.Load(Server.MapPath( " Shippers.xml " ));
XmlNodeList xnl = xml.SelectNodes( " //Table[Phone='0991']/* " ); // 建立一个节点集,把查询到的多个结果放到里面
foreach (XmlElement xe in xnl) // 把每个节点转成元素显示出来
... {
Response.Write(xe.InnerText + “<br>”);
}