




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#操作XML(读XML,写XML,更新,删除节点,与dataset结合等),以下就是操作XML的所有方法,相信可以满足很大一部份的使用了。已知有一个XML文件(bookstore.xml)如下:Corets, Eva5.951、插入节点往节点中插入一个节点:复制代码代码如下:XmlDocument xmlDoc=new XmlDocument();xmlDoc.Load(bookstore.xml);XmlNode root=xmlDoc.SelectSingleNode(bookstore);/查找XmlElement xe1=xmlDoc.CreateElement(book);/创建一个节点xe1.SetAttribute(genre,李赞红);/设置该节点genre属性xe1.SetAttribute(ISBN,2-3631-4);/设置该节点ISBN属性XmlElement xesub1=xmlDoc.CreateElement(title);xesub1.InnerText=CS从入门到精通;/设置文本节点xe1.AppendChild(xesub1);/添加到节点中XmlElement xesub2=xmlDoc.CreateElement(author);xesub2.InnerText=候捷;xe1.AppendChild(xesub2);XmlElement xesub3=xmlDoc.CreateElement(price);xesub3.InnerText=58.3;xe1.AppendChild(xesub3);root.AppendChild(xe1);/添加到节点中xmlDoc.Save(bookstore.xml);结果为:Corets, Eva5.95候捷58.32、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点的文本修改为“亚胜”。复制代码代码如下:XmlNodeList nodeList=xmlDoc.SelectSingleNode(bookstore).ChildNodes;/获取bookstore节点的所有子节点foreach(XmlNode xn in nodeList)/遍历所有子节点XmlElement xe=(XmlElement)xn;/将子节点类型转换为XmlElement类型if(xe.GetAttribute(genre)=李赞红)/如果genre属性值为“李赞红”xe.SetAttribute(genre,update李赞红);/则修改该属性为“update李赞红”XmlNodeList nls=xe.ChildNodes;/继续获取xe子节点的所有子节点foreach(XmlNode xn1 in nls)/遍历XmlElement xe2=(XmlElement)xn1;/转换类型if(xe2.Name=author)/如果找到xe2.InnerText=亚胜;/则修改break;/找到退出来就可以了break;xmlDoc.Save(bookstore.xml);/保存。最后结果为:Corets, Eva5.95亚胜58.33、删除节点节点的genre属性,删除 节点。复制代码代码如下:XmlNodeList xnl=xmlDoc.SelectSingleNode(bookstore).ChildNodes;foreach(XmlNode xn in xnl)XmlElement xe=(XmlElement)xn;if(xe.GetAttribute(genre)=fantasy)xe.RemoveAttribute(genre);/删除genre属性else if(xe.GetAttribute(genre)=update李赞红)xe.RemoveAll();/删除该节点的全部内容xmlDoc.Save(bookstore.xml);最后结果为:Corets, Eva5.954、显示所有数据。复制代码代码如下:XmlNode xn=xmlDoc.SelectSingleNode(bookstore);XmlNodeList xnl=xn.ChildNodes;foreach(XmlNode xnf in xnl)XmlElement xe=(XmlElement)xnf;Console.WriteLine(xe.GetAttribute(genre);/显示属性值Console.WriteLine(xe.GetAttribute(ISBN);XmlNodeList xnf1=xe.ChildNodes;foreach(XmlNode xn2 in xnf1)Console.WriteLine(xn2.InnerText);/显示子节点点文本loading.一个通过DataSet操作XML的类(源代码)复制代码代码如下:using System;using System.Data;using System.Xml;using System.Windows.Forms;/*/ 作者: 明天去要饭/ QICQ: 305725744/ .Net群: 6370988/ /kgdiwss/*namespace YSTRP.Common/ OperateXmlByDataSet 的摘要说明。/public class OperateXmlByDataSetpublic OperateXmlByDataSet()/ TODO: 在此处添加构造函数逻辑/#region GetDataSetByXml/ 读取xml直接返回DataSet/ xml文件相对路径/public static DataSet GetDataSetByXml(string strXmlPath)tryDataSet ds = new DataSet();ds.ReadXml(GetXmlFullPath(strXmlPath);if(ds.Tables.Count 0)return ds;return null;catch(Exception ex)System.Windows.Forms.MessageBox.Show(ex.ToString();return null;#endregion#region GetDataViewByXml/ 读取Xml返回一个经排序或筛选后的DataView/ 筛选条件,如:name = kgdiwss/ 排序条件,如:Id desc/public static DataView GetDataViewByXml(string strXmlPath,string strWhere,string strSort)tryDataSet ds = new DataSet();ds.ReadXml(GetXmlFullPath(strXmlPath);DataView dv = new DataView(ds.Tables0);if(strSort != null)dv.Sort = strSort;if(strWhere != null)dv.RowFilter = strWhere;return dv;catch(Exception)return null;#endregion#region WriteXmlByDataSet/ 向Xml文件插入一行数据/ xml文件相对路径/ 要插入行的列名数组,如:string Columns = name,IsMarried;/ 要插入行每列的值数组,如:string ColumnValue=明天去要饭,false;/ 成功返回true,否则返回falsepublic static bool WriteXmlByDataSet(string strXmlPath,string Columns,string ColumnValue)try/根据传入的XML路径得到.XSD的路径,两个文件放在同一个目录下string strXsdPath = strXmlPath.Substring(0,strXmlPath.IndexOf(.) + .xsd;DataSet ds = new DataSet();/读xml架构,关系到列的数据类型ds.ReadXmlSchema(GetXmlFullPath(strXsdPath);ds.ReadXml(GetXmlFullPath(strXmlPath);DataTable dt = ds.Tables0;/在原来的表格基础上创建新行DataRow newRow = dt.NewRow();/循环给一行中的各个列赋值for(int i=0; i 0)for(int i=0; i ds.Tables0.Rows.Count; i+)/如果当前记录为符合Where条件的记录if(ds.Tables0.RowsistrWhereColumnName.ToString().Trim().Equals(strWhereColumnValue)/循环给找到行的各列赋新值for(int j=0; j 0)/删除符号条件的行ds.Tables0.RowsiDeleteRow.Delete();ds.WriteXml(GetXmlFullPath(strXmlPath);return true;catch(Exception)return false;#endregion#region DeleteXmlRows/ 删除strColumn列中值为ColumnValue的行/ xml相对路径/ 列名/ strColumn列中值为ColumnValue的行均会被删除/public static bool DeleteXmlRows(string strXmlPath,string strColumn,string ColumnValue)tryDataSet ds = new DataSet();ds.ReadXml(GetXmlFullPath(strXmlPath);/先判断行数if(ds.Tables0.Rows.Count 0)/判断行多还是删除的值多,多的for循环放在里面if(ColumnValue.Length ds.Tables0.Rows.Count)for(int i=0; i ds.Tables0.Rows.Count; i+)for(int j=0; j ColumnValue.Length; j+)if(ds.Tables0.RowsistrColumn.ToString().Trim().Equals(ColumnValuej)ds.Tables0.Rowsi.Delete();elsefor(int j=0; j ColumnValue.Length; j+)for(int i=0; i 0)/移除所有记录ds.Tables0.Rows.Clear();/重新写入,这时XML文件中就只剩根节点了ds.WriteXml(GetXmlFullPath(strXmlPath);return true;catch(Exception)return false;#endregion#region GetXmlFullPath/ 返回完整路径/ Xml的路径/public static string GetXmlFullPath(string strPath)if(strPath.IndexOf(:) 0)return strPath;elsereturn Application.StartupPath + strPath;#endregion2005-10-3一个通过DataSet操作XML的类这段时间写的项目每次都要用到XML保存一些配置,而每次操作XML都觉得挺麻烦,没有数据库那么顺手。后来发现用DataSet操作XML很方便,而且灵活性比较好,于是写了一个操作XML的类,用来应付一般的XML操作(源码下载附件)。1 基本思路其实用DataSet操作XML,归根到底就是对DataSet里的表格,行,列等进行操作,然后用DataSet里的东西重新写到XML中,从而实现编辑XML的目的。如果再配合上.xsd文件的话,那效果更佳。2 程序详解(1) XML文件内容本类操作的XML和生成的XML格式是一样的,如下:/xml_xmlDB.xsd2 A程序员2开发B/S结构程序 c#等建国路XXX2008-8-31false4c#程序员2开发B/S结构程序 c#等建国路XXX2008-8-31false然后点击XML文件右下角的“数据”,即可看到熟悉的表格形式,在表格的任意位置上单击右键选择“创建架构”,将会生成一个.xsd文件,该文件用来定义XML各列的类型。其内容如下(点击查看代码2附件):/xml_xmlDB.xsd xmlns:mstns=/xml_xmlDB.xsdxmlns=/xml_xmlDB.xsd xmlns:xs=/2001/XMLSchema xmlns:msdata=urn:schemas-microsoft-com:xml-msdataattributeFormDefault=qualified elementFormDefault=qualified msdata:Locale=zh-CN msdata:EnforceConstaints=False?msdata:AutoIncrement=true msdata:AutoIncrementStep=1msdata:AutoIncrementSeed=1 /注意:如果想像数据库一样有一个自动增长的ID字段,则可以这样操作:首先在XML中添加一个元素,这样生成.xsd的时候,就会有一个ID段,在.xsd中选中ID这一列,在右边的属性中,将“AutoIncrementSeed”和“AutoIncrementStep”分别设置为1,这样ID就会从1开始以步长为1自动增长。以上代码如果看不懂并不要紧,因为我们可以通过DataSet来生成这种格式的内容。接下来将开始操作XML。(2) 处理XML文件路径这里主要是对传入的XML路径进行处理,如果传入的是相对路径,则返回完整路径,如果传入的是完整路径,则不做处理直接返回。方法如下:#region GetXmlFullPath/ 返回完整路径/ Xml的路径/public static string GetXmlFullPath(string strPath)/如果路径中含有:符号,则认定为传入的是完整路径if(strPath.IndexOf(:) 0)return strPath;else/返回完整路径return System.Web.HttpContext.Current.Server.MapPath(strPath);#endregion(3) 读取记录读取XML的数据到DataSet中的方法为:#region GetDataSetByXml/ 读取xml直接返回DataSet/ xml文件相对路径/public static DataSet GetDataSetByXml(string strXmlPath)tryDataSet ds = new DataSet();/读取XML到DataSetds.ReadXml(GetXmlFullPath(strXmlPath);if(ds.Tables.Count 0)return ds;return null;catch(Exception)return null;#endregion以上方法将得到一个DataSet,里面保存的是全部XML记录的信息,而且没有经过任何处理。但很多时候我们需要的只是一些满足条件的记录,这时需要用以下方法得到:#region GetDataViewByXml/ summary/ 读取Xml返回一个经排序或筛选后的DataView/ /summary/ param name=strXmlPath/param/ param name=strWhere筛选条件,如:name = kgdiwss/param/ param name=strSort排序条件,如:Id desc/param/ returns/returnspublic static DataView GetDataViewByXml(string strXmlPath,string strWhere,string strSort)tryDataSet ds = new DataSet();ds.ReadXml(GetXmlFullPath(strXmlPath);/创建DataView来完成排序或筛选操作DataView dv = new DataView(ds.Tables0);if(strSort != null)/对DataView中的记录进行排序dv.Sort = strSort;if(strWhere != null)/对DataView中的记录进行筛选,找到我们想要的记录dv.RowFilter = strWhere;return dv;catch(Exception)return null;#endregion(4) 插入记录到现在为止我们已经可以随意读取XML中的记录,接下来来实现写入XML的操作,方法如下:#region WriteXmlByDataSet/ summary/ 向Xml文件插入一行数据/ /summary/ param name=strXmlPathxml文件相对路径/param/ param name=Columns要插入行的列名数组,如:string Columns = name,IsMarried;/param/ param name=ColumnValue要插入行每列的值数组,如:string ColumnValue=kgdiwss,false;/param/ returns成功返回true,否则返回false/returnspublic static bool WriteXmlByDataSet(string strXmlPath,string Columns,string ColumnValue)try/根据传入的XML路径得到.XSD的路径,两个文件放在同一个目录下string strXsdPath = strXmlPath.Substring(0,strXmlPath.IndexOf(.) + .xsd;DataSet ds = new DataSet();/读xml架构,关系到列的数据类型ds.ReadXmlSchema(GetXmlFullPath(strXsdPath);ds.ReadXml(GetXmlFullPath(strXmlPath);DataTable dt = ds.Tables0;/在原来的表格基础上创建新行DataRow newRow = dt.NewRow();/循环给 一行中的各个列赋值for(int i=0; i Columns.Length; i+)newRowColumnsi = ColumnValuei;dt.Rows.Add(newRow);dt.AcceptChanges();ds.AcceptChanges();ds.WriteXml(GetXmlFullPath(strXmlPath);return true;catch(Exception)return false;#endregion可能有的朋友不知道怎么用这个方法插入数据,在后面我将用实例介绍。(5) 修改记录修改记录的方法要传入的参数相对较多,因为修改记录需要先定位到具体哪一条记录,再修改指定列的值,以下为修改XML的方法:#region UpdateXmlRow/ summary/ 更行符合条件的一条Xml记录/ /summary/ param name=strXmlPathXML文件路径/param/ param name=Columns列名数组/param/ param name=ColumnValue列值数组/param/ param name=strWhereColumnName条件列名/param/ param name=strWhereColumnValue条件列值/param/ returns/returnspublic static bool UpdateXmlRow(string strXmlPath,string Columns,string ColumnValue,string strWhereColumnName,string strWhereColumnValue)try/同上一方法string strXsdPath = strXmlPath.Substring(0,strXmlPath.IndexOf(.) + .xsd;DataSet ds = new DataSet();/读xml架构,关系到列的数据类型ds.ReadXmlSchema(GetXmlFullPath(strXsdPath);ds.ReadXml(GetXmlFullPath(strXmlPath);/先判断行数if(ds.Tables0.Rows.Count 0)for(int i=0; i ds.Tables0.Rows.Count; i+)/如果当前记录为符合Where条件的记录if(ds.Tables0.RowsistrWhereColumnName.ToString().Trim().Equals(strWhereColumnValue)/循环给找到行的各列赋新值for(int j=0; j Columns.Length; j+)ds.Tables0.RowsiColumnsj = ColumnValuej;/更新DataSetds.AcceptChanges();/重新写入XML文件ds.WriteXml(GetXmlFullPath(strXmlPath);return true;return false;catch(Exception)return false;#endregion(6) 删除记录为了方便,删除记录提供了三个方法,一个可以删除所有记录,一个删除符合条件的行,还有一个删除指定Index值的行,该Index值和记录在DataSet中的Index值对应。删除所有记录的方法为:#region DeleteXmlAllRows/ summary/ 删除所有行/ /summary/ param name=strXmlPathXML路径/param/ returns/returnspublic static bool DeleteXmlAllRows(string strXmlPath)tryDataSet ds = new DataSet();ds.ReadXml(GetXmlFullPath(strXmlPath);/如果记录条数大于0if(ds.Tables0.Rows.Count 0)/移除所有记录ds.Tables0.Rows.Clear();/重新写入,这时XML文件中就只剩根节点了ds.WriteXml(GetXmlFullPath(strXmlPath);return true;catch(Exception)return false;#endregion删除指定Index值的行的方法为:#region DeleteXmlRowByIndex/ summary/ 通过删除DataSet中iDeleteRow这一行,然后重写Xml以实现删除指定行/ /summary/ param name=strXmlPath/param/ param name=iDeleteRow要删除的行在DataSet中的Index值/parampublic static bool DeleteXmlRowByIndex(string strXmlPath,int iDeleteRow)tryDataSet ds = new DataSet();ds.ReadXml(GetXmlFullPath(strXmlPath);if(ds.Tables0.Rows.Count 0)/删除符号条件的行ds.Tables0.RowsiDeleteRow.Delete();ds.WriteXml(GetXmlFullPath(strXmlPath);return true;catch(Exception)return false;#endregion这里说一下提供此方法的原因,有的时候将XML的内容读到DataSet,然后绑定到DataGrid后,由于DataGrid中只有一个模板列,而模板列里又套了表格等许多控件,这就使得我们可能无法得到记录对应的ID值,这个时候就可以先得到记录的Index值(第一行为0,第二行为1,以此类推),然后将该Index值传到方法中,就可以将该记录删掉。注意:使用该方法的时候,绑定到DataGrid上的DataSet和删除时用的DataSet要为同一个,也就是说Index要相同,不能有排序,不然会误将记录。有时候我们需要删除符合条件的多行,这个时候可以用以下方法实现:#region DeleteXmlRows/ summary/ 删除strColumn列中值为ColumnValue的行/ /summary/ param name=strXmlPathxml相对路径/param/ param name=strColumn列名/param/ param name=ColumnValuestrColumn列中值为ColumnValue的行均会被删除/param/ returns/returnspublic static bool DeleteXmlRows(string strXmlPath,string strColumn,string ColumnValue)tryDataSet ds = new DataSet();ds.ReadXml(GetXmlFullPath(strXmlPath);/先判断行数if(ds.Tables0.Rows.Count 0)/判断行多还是删除的值多,多的for循环放在里面if(ColumnValue.Length ds.Tables0.Rows.Count)for(int i=0; i ds.Tables0.Rows.Count; i+)for(int j=0; j ColumnValue.Length; j+)/找到符合条件的行if(ds.Tables0.RowsistrColumn.ToString().Trim().Equals(ColumnValuej)/删除行ds.Tables0.Rowsi.Delete();elsefor(int j=0; j ColumnValue.Length; j+)for(int i=0; i ds.Tables0.Rows.Count; i+)/找到符合条件的行if(ds.Tables0.RowsistrColumn.ToString().Trim().Equals(ColumnValuej)/删除行ds.Tables0.Rowsi.Delete();ds.WriteXml(GetXmlFullPath(strXmlPath);return true;catch(Exception)return false;#endregion3实例解析(7) 读取XML以下代码读取到一个没有排序和筛选的DataSet。DataGrid1.DataSource = OperateXmlByDataSet.GetDataSetByXml(xml/xml_xmlDB.xml);DataGrid1.DataBind();以下代码读到的数据是经
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育教学理念演讲课件
- 学校一周工作总结
- 改装喷淋头施工方案范本
- 霍曼门的施工方案
- 剪力墙破除重新施工方案
- 陕西安全资格证c类考试题库及答案解析
- 临床护理带教老师选拔
- 公路路肩工程施工方案
- 塑料防水板公路施工方案
- 幼儿园科研汇报
- 人民调解投标方案(完整技术标)
- ZSMC之山智控 K5系列说明书V1.6-中文
- 2023恒温恒湿实验室工程技术规程
- GB/T 4798.4-2023环境条件分类环境参数组分类及其严酷程度分级第4部分:无气候防护场所固定使用
- 程序设计基础(第3版)(2019年高等教育出版社出版图书)
- (小鼠)常用实验动物生物学特点及其在生物医学教程课件
- GB/T 5023.1-2008额定电压450/750 V及以下聚氯乙烯绝缘电缆第1部分:一般要求
- 第七章-辐射防护分析课件
- 研究生英语阅读综合教程reading more
- 国有企业职务犯罪惩治与预防
- 国家教学示范中心-电子科学与技术中心-国防科技大学
评论
0/150
提交评论