这个例子是基本我个人应用的实例。
背景:有个xml文件需要在管理模块实现维护(增删改)|asp.net|web系统
维护页面是个GridView形式的。
1、以下是XML文件样例
北京 116.392129 39.90071 上海 121.436573 31.183314
2、读取XML文件返回DataTable类型的方法
////// 读取XML文件 /// ///protected DataTable GetDt() { XmlDocument myDocument = new XmlDocument(); myDocument.Load(Server.MapPath("~/index/city.xml"));//XML文件在项目的某个目录里 using (XmlNodeReader reader = new XmlNodeReader(myDocument)) { DataSet dataSetXml = new DataSet(); dataSetXml.ReadXml(reader); DataTable dataTableXml = dataSetXml.Tables[0]; return dataTableXml; } }
说明:返回以后绑定到GridView中,需要注意的是,这个方法默认获取到的列是XML文件样例中number标签的"id"属性、name、Longitude、Latitude、templateid里的文本内容。
3、向XML文件添加节点保存的方法
////// 添加节点 /// protected void Add() { int id = int.Parse(hf.Value) + 1;//hf是记录xml文件中当前number的最大id的,新添一个节点id就要加1 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Server.MapPath("~/index/city.xml")); XmlNode root = xmlDoc.SelectSingleNode("earth");//查找XmlElement xe1 = xmlDoc.CreateElement("number");//创建一个 节点 xe1.SetAttribute("id", id.ToString());//设置该节点id属性 XmlElement xesub1 = xmlDoc.CreateElement("name"); xesub1.InnerText = txt_name.Text;//设置文本节点 xe1.AppendChild(xesub1);//添加到 节点中 XmlElement xesub2 = xmlDoc.CreateElement("Longitude"); xesub2.InnerText = txt_Longitude.Text; xe1.AppendChild(xesub2); XmlElement xesub3 = xmlDoc.CreateElement("Latitude"); xesub3.InnerText = txt_Latitude.Text; xe1.AppendChild(xesub3); XmlElement xesub4 = xmlDoc.CreateElement("templateid"); xesub4.InnerText = ""; xe1.AppendChild(xesub4); root.AppendChild(xe1);//添加到 节点中 xmlDoc.Save(Server.MapPath("~/index/city.xml"));//保存到xml文件中 }
说明:需要说明一点,当前创建的xml文件可能不允许读写操作,这时就要设置权限,可以给xml文件所在的文件夹加Everone权限,或者在文件夹右键-属性-常规,把只读前的小对勾去掉-确定。
4、修改XML文件中节点的方法
////// 修改节点 /// protected void Mod() { string id = hfid.Value;//一个常量保存了number标签的id属性 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Server.MapPath("~/index/city.xml")); XmlNodeList nodeList = xmlDoc.SelectSingleNode("earth").ChildNodes; foreach (XmlNode xn in nodeList)//遍历所有子节点 { XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型 if (xe.GetAttribute("id") == id)//如果id属性值 { XmlNodeList nls = xe.ChildNodes;//继续获取xe子节点的所有子节点 foreach (XmlNode xn1 in nls)//遍历 { XmlElement xe2 = (XmlElement)xn1;//转换类型 if (xe2.Name == "name")//如果找到 { xe2.InnerText =txt_name.Text; continue; } if (xe2.Name == "Longitude") { xe2.InnerText =txt_Longitude.Text; continue; } if (xe2.Name == "Latitude") { xe2.InnerText =txt_Latitude.Text; break;//要修改的属性修改完则退出 } } break; } } xmlDoc.Save(Server.MapPath("~/index/city.xml")); }
说明:我在这里是通过number节点的id属性来唯一标示节点的,这个无所谓,可以举一反三的,只要能找到节点即可修改之,这只是个简单例子,可以根据实际情况变换。
5、删除XML文件中的节点方法
////// 删除节点 /// /// 节点名称 protected void Del(string name) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Server.MapPath("~/index/city.xml")); XmlNodeList xnl = xmlDoc.SelectNodes("earth/number"); foreach (XmlNode xn in xnl) { XmlElement xe = (XmlElement)xn.SelectSingleNode("name"); if (xe != null && xe.InnerText == name) { xn.ParentNode.RemoveChild(xn);//删除name节点所在父节点即整个number节点 } } xmlDoc.Save(Server.MapPath("~/index/city.xml")); }
说明:在这里需要传值,是一个子节点name的文本内容,根据它确定它所在的number父节点,然后将这个number父节点删除。暂时没想到别的更好的方法,如果你有更好的方法,欢迎回帖交流。
好了,暂时到这。简单的例子,欢迎深入交流。