您的位置:首页 > 数据库

对XML进行简单的查询,插入,删除,编辑操作

2007-01-08 19:59 447 查看
  以前一直搞不明白为什么要用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贴出来


<?xml version="1.0" standalone="yes"?>


<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数据读取方法


DataSet ds = new DataSet();


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及相关类进行数据添加。


XmlDocument xml = new XmlDocument();//先建立一个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的节点,找到后进行修改


        XmlDocument xml = new XmlDocument();


        xml.Load(Server.MapPath("Shippers.xml"));


        


        XmlNodeList xnl = xml.DocumentElemen
f1af
t.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、删除数据

  删除数据和编辑数据一样,只有一句代码不同


        XmlDocument xml = new XmlDocument();


        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的公司名称:


        XmlDocument xml = new XmlDocument();


        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的一行数据全部返回:


        XmlDocument xml = new XmlDocument();


        xml.Load(Server.MapPath("Shippers.xml"));        


        XmlNodeList xnl = xml.SelectNodes("//Table[Phone='0991']/*");//建立一个节点集,把查询到的多个结果放到里面


        foreach (XmlElement xe in xnl)//把每个节点转成元素显示出来




        ...{


            Response.Write(xe.InnerText + “<br>”);


        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐