c#操作XML(读XML,写XML,更新,删除节.doc_第1页
c#操作XML(读XML,写XML,更新,删除节.doc_第2页
c#操作XML(读XML,写XML,更新,删除节.doc_第3页
c#操作XML(读XML,写XML,更新,删除节.doc_第4页
c#操作XML(读XML,写XML,更新,删除节.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

我用的是一种很笨的方法,但可以帮助初学者了解访问XML节点的过程。已知有一个XML文件(bookstore.xml)如下:Corets,Eva5.951、插入节点往节点中插入一个节点:XmlDocumentxmlDoc=newXmlDocument();xmlDoc.Load(bookstore.xml);XmlNoderoot=xmlDoc.SelectSingleNode(bookstore);/查找XmlElementxe1=xmlDoc.CreateElement(book);/创建一个节点xe1.SetAttribute(genre,李赞红);/设置该节点genre属性xe1.SetAttribute(ISBN,2-3631-4);/设置该节点ISBN属性XmlElementxesub1=xmlDoc.CreateElement(title);xesub1.InnerText=CS从入门到精通;/设置文本节点xe1.AppendChild(xesub1);/添加到节点中XmlElementxesub2=xmlDoc.CreateElement(author);xesub2.InnerText=候捷;xe1.AppendChild(xesub2);XmlElementxesub3=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李赞红”,将该节点的子节点的文本修改为“亚胜”。XmlNodeListnodeList=xmlDoc.SelectSingleNode(bookstore).ChildNodes;/获取bookstore节点的所有子节点foreach(XmlNodexninnodeList)/遍历所有子节点XmlElementxe=(XmlElement)xn;/将子节点类型转换为XmlElement类型if(xe.GetAttribute(genre)=李赞红)/如果genre属性值为“李赞红”xe.SetAttribute(genre,update李赞红);/则修改该属性为“update李赞红”XmlNodeListnls=xe.ChildNodes;/继续获取xe子节点的所有子节点foreach(XmlNodexn1innls)/遍历XmlElementxe2=(XmlElement)xn1;/转换类型if(xe2.Name=author)/如果找到xe2.InnerText=亚胜;/则修改break;/找到退出来就可以了break;xmlDoc.Save(bookstore.xml);/保存。最后结果为:Corets,Eva5.95亚胜58.33、删除节点节点的genre属性,删除节点。XmlNodeListxnl=xmlDoc.SelectSingleNode(bookstore).ChildNodes;foreach(XmlNodexninxnl)XmlElementxe=(XmlElement)xn;if(xe.GetAttribute(genre)=fantasy)xe.RemoveAttribute(genre);/删除genre属性elseif(xe.GetAttribute(genre)=update李赞红)xe.RemoveAll();/删除该节点的全部内容xmlDoc.Save(bookstore.xml);最后结果为:Corets,Eva5.954、显示所有数据。XmlNodexn=xmlDoc.SelectSingleNode(bookstore);XmlNodeListxnl=xn.ChildNodes;foreach(XmlNodexnfinxnl)XmlElementxe=(XmlElement)xnf;Console.WriteLine(xe.GetAttribute(genre);/显示属性值Console.WriteLine(xe.GetAttribute(ISBN);XmlNodeListxnf1=xe.ChildNodes;foreach(XmlNodexn2inxnf1)Console.WriteLine(xn2.InnerText);/显示子节点点文本loading.2005-10-3一个通过DataSet操作XML的类(源代码)usingSystem;usingSystem.Data;usingSystem.Xml;usingSystem.Windows.Forms;namespaceYSTRP.Common/OperateXmlByDataSet的摘要说明。/publicclassOperateXmlByDataSetpublicOperateXmlByDataSet()/TODO:在此处添加构造函数逻辑/#regionGetDataSetByXml/读取xml直接返回DataSet/xml文件相对路径/publicstaticDataSetGetDataSetByXml(stringstrXmlPath)tryDataSetds=newDataSet();ds.ReadXml(GetXmlFullPath(strXmlPath);if(ds.Tables.Count0)returnds;returnnull;catch(Exceptionex)System.Windows.Forms.MessageBox.Show(ex.ToString();returnnull;#endregion#regionGetDataViewByXml/读取Xml返回一个经排序或筛选后的DataView/筛选条件,如:name=kgdiwss/排序条件,如:Iddesc/publicstaticDataViewGetDataViewByXml(stringstrXmlPath,stringstrWhere,stringstrSort)tryDataSetds=newDataSet();ds.ReadXml(GetXmlFullPath(strXmlPath);DataViewdv=newDataView(ds.Tables0);if(strSort!=null)dv.Sort=strSort;if(strWhere!=null)dv.RowFilter=strWhere;returndv;catch(Exception)returnnull;#endregion#regionWriteXmlByDataSet/向Xml文件插入一行数据/xml文件相对路径/要插入行的列名数组,如:stringColumns=name,IsMarried;/要插入行每列的值数组,如:stringColumnValue=明天去要饭,false;/成功返回true,否则返回falsepublicstaticboolWriteXmlByDataSet(stringstrXmlPath,stringColumns,stringColumnValue)try/根据传入的XML路径得到.XSD的路径,两个文件放在同一个目录下stringstrXsdPath=strXmlPath.Substring(0,strXmlPath.IndexOf(.)+.xsd;DataSetds=newDataSet();/读xml架构,关系到列的数据类型ds.ReadXmlSchema(GetXmlFullPath(strXsdPath);ds.ReadXml(GetXmlFullPath(strXmlPath);DataTabledt=ds.Tables0;/在原来的表格基础上创建新行DataRownewRow=dt.NewRow();/循环给一行中的各个列赋值for(inti=0;i0)for(inti=0;ids.Tables0.Rows.Count;i+)/如果当前记录为符合Where条件的记录if(ds.Tables0.RowsistrWhereColumnName.ToString().Trim().Equals(strWhereColumnValue)/循环给找到行的各列赋新值for(intj=0;j0)/删除符号条件的行ds.Tables0.RowsiDeleteRow.Delete();ds.WriteXml(GetXmlFullPath(strXmlPath);returntrue;catch(Exception)returnfalse;#endregion#regionDeleteXmlRows/删除strColumn列中值为ColumnValue的行/xml相对路径/列名/strColumn列中值为ColumnValue的行均会被删除/publicstaticboolDeleteXmlRows(stringstrXmlPath,stringstrColumn,stringColumnValue)tryDataSetds=newDataSet();ds.ReadXml(GetXmlFullPath(strXmlPath);/先判断行数if(ds.Tables0.Rows.Count0)/判断行多还是删除的值多,多的for循环放在里面if(ColumnValue.Lengthds.Tables0.Rows.Count)for(inti=0;ids.Tables0.Rows.Count;i+)for(intj=0;jColumnValue.Length;j+)if(ds.Tables0.RowsistrColumn.ToString().Trim().Equals(ColumnValuej)ds.Tables0.Rowsi.Delete();elsefor(intj=0;jColumnValue.Length;j+)for(inti=0;i0)/移除所有记录ds.Tables0.Rows.Clear();/重新写入,这时XML文件中就只剩根节点了ds.WriteXml(GetXmlFullPath(strXmlPath);returntrue;catch(Exception)returnfalse;#endregion#regionGetXmlFullPath/返回完整路径/Xml的路径/publicstaticstringGetXmlFullPath(stringstrPath)if(strPath.IndexOf(:)0)returnstrPath;elsereturnApplication.StartupPath+strPath;#endregionloading.2005-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.xsd2A程序员2开发B/S结构程序c#等建国路XXX2008-8-31false4c#程序员2开发B/S结构程序c#等建国路XXX2008-8-31false然后点击XML文件右下角的“数据”,即可看到熟悉的表格形式,在表格的任意位置上单击右键选择“创建架构”,将会生成一个.xsd文件,该文件用来定义XML各列的类型。其内容如下(点击查看代码2附件):/xml_xmlDB.xsdxmlns:mstns=/xml_xmlDB.xsdxmlns=/xml_xmlDB.xsdxmlns:xs=/2001/XMLSchemaxmlns:msdata=urn:schemas-microsoft-com:xml-msdataattributeFormDefault=qualifiedelementFormDefault=qualifiedmsdata:Locale=zh-CNmsdata:EnforceConstaints=False?msdata:AutoIncrement=truemsdata:AutoIncrementStep=1msdata:AutoIncrementSeed=1/注意:如果想像数据库一样有一个自动增长的ID字段,则可以这样操作:首先在XML中添加一个元素,这样生成.xsd的时候,就会有一个ID段,在.xsd中选中ID这一列,在右边的属性中,将“AutoIncrementSeed”和“AutoIncrementStep”分别设置为1,这样ID就会从1开始以步长为1自动增长。以上代码如果看不懂并不要紧,因为我们可以通过DataSet来生成这种格式的内容。接下来将开始操作XML。(2)处理XML文件路径这里主要是对传入的XML路径进行处理,如果传入的是相对路径,则返回完整路径,如果传入的是完整路径,则不做处理直接返回。方法如下:#regionGetXmlFullPath/返回完整路径/Xml的路径/publicstaticstringGetXmlFullPath(stringstrPath)/如果路径中含有:符号,则认定为传入的是完整路径if(strPath.IndexOf(:)0)returnstrPath;else/返回完整路径returnSystem.Web.HttpContext.Current.Server.MapPath(strPath);#endregion(3)读取记录读取XML的数据到DataSet中的方法为:#regionGetDataSetByXml/读取xml直接返回DataSet/xml文件相对路径/publicstaticDataSetGetDataSetByXml(stringstrXmlPath)tryDataSetds=newDataSet();/读取XML到DataSetds.ReadXml(GetXmlFullPath(strXmlPath);if(ds.Tables.Count0)returnds;returnnull;catch(Exception)returnnull;#endregion以上方法将得到一个DataSet,里面保存的是全部XML记录的信息,而且没有经过任何处理。但很多时候我们需要的只是一些满足条件的记录,这时需要用以下方法得到:#regionGetDataViewByXml/summary/读取Xml返回一个经排序或筛选后的DataView/summary/paramname=strXmlPath/param/paramname=strWhere筛选条件,如:name=kgdiwss/param/paramname=strSort排序条件,如:Iddesc/param/returns/returnspublicstaticDataViewGetDataViewByXml(stringstrXmlPath,stringstrWhere,stringstrSort)tryDataSetds=newDataSet();ds.ReadXml(GetXmlFullPath(strXmlPath);/创建DataView来完成排序或筛选操作DataViewdv=newDataView(ds.Tables0);if(strSort!=null)/对DataView中的记录进行排序dv.Sort=strSort;if(strWhere!=null)/对DataView中的记录进行筛选,找到我们想要的记录dv.RowFilter=strWhere;returndv;catch(Exception)returnnull;#endregion(4)插入记录到现在为止我们已经可以随意读取XML中的记录,接下来来实现写入XML的操作,方法如下:#regionWriteXmlByDataSet/summary/向Xml文件插入一行数据/summary/paramname=strXmlPathxml文件相对路径/param/paramname=Columns要插入行的列名数组,如:stringColumns=name,IsMarried;/param/paramname=ColumnValue要插入行每列的值数组,如:stringColumnValue=kgdiwss,false;/param/returns成功返回true,否则返回false/returnspublicstaticboolWriteXmlByDataSet(stringstrXmlPath,stringColumns,stringColumnValue)try/根据传入的XML路径得到.XSD的路径,两个文件放在同一个目录下stringstrXsdPath=strXmlPath.Substring(0,strXmlPath.IndexOf(.)+.xsd;DataSetds=newDataSet();/读xml架构,关系到列的数据类型ds.ReadXmlSchema(GetXmlFullPath(strXsdPath);ds.ReadXml(GetXmlFullPath(strXmlPath);DataTabledt=ds.Tables0;/在原来的表格基础上创建新行DataRownewRow=dt.NewRow();/循环给一行中的各个列赋值for(inti=0;iColumns.Length;i+)newRowColumnsi=ColumnValuei;dt.Rows.Add(newRow);dt.AcceptChanges();ds.AcceptChanges();ds.WriteXml(GetXmlFullPath(strXmlPath);returntrue;catch(Exception)returnfalse;#endregion可能有的朋友不知道怎么用这个方法插入数据,在后面我将用实例介绍。(5)修改记录修改记录的方法要传入的参数相对较多,因为修改记录需要先定位到具体哪一条记录,再修改指定列的值,以下为修改XML的方法:#regionUpdateXmlRow/summary/更行符合条件的一条Xml记录/summary/paramname=strXmlPathXML文件路径/param/paramname=Columns列名数组/param/paramname=ColumnValue列值数组/param/paramname=strWhereColumnName条件列名/param/paramname=strWhereColumnValue条件列值/param/returns/returnspublicstaticboolUpdateXmlRow(stringstrXmlPath,stringColumns,stringColumnValue,stringstrWhereColumnName,stringstrWhereColumnValue)try/同上一方法stringstrXsdPath=strXmlPath.Substring(0,strXmlPath.IndexOf(.)+.xsd;DataSetds=newDataSet();/读xml架构,关系到列的数据类型ds.ReadXmlSchema(GetXmlFullPath(strXsdPath);ds.ReadXml(GetXmlFullPath(strXmlPath);/先判断行数if(ds.Tables0.Rows.Count0)for(inti=0;ids.Tables0.Rows.Count;i+)/如果当前记录为符合Where条件的记录if(ds.Tables0.RowsistrWhereColumnName.ToString().Trim().Equals(strWhereColumnValue)/循环给找到行的各列赋新值for(intj=0;jColumns.Length;j+)ds.Tables0.RowsiColumnsj=ColumnValuej;/更新DataSetds.AcceptChanges();/重新写入XML文件ds.WriteXml(GetXmlFullPath(strXmlPath);returntrue;returnfalse;catch(Exception)returnfalse;#endregion(6)删除记录为了方便,删除记录提供了三个方法,一个可以删除所有记录,一个删除符合条件的行,还有一个删除指定Index值的行,该Index值和记录在DataSet中的Index值对应。删除所有记录的方法为:#regionDeleteXmlAllRows/summary/删除所有行/summary/paramname=strXmlPathXML路径/param/returns/returnspublicstaticboolDeleteXmlAllRows(stringstrXmlPath)tryDataSetds=newDataSet();ds.ReadXml(GetXmlFullPath(strXmlPath);/如果记录条数大于0if(ds.Tables0.Rows.Count0)/移除所有记录ds.Tables0.Rows.Clear();/重新写入,这时XML文件中就只剩根节点了ds.WriteXml(GetXmlFullPath(strXmlPath);returntrue;catch(Exception)returnfalse;#endregion删除指定Index值的行的方法为:#regionDeleteXmlRowByIndex/summary/通过删除DataSet中iDeleteRow这一行,然后重写Xml以实现删除指定行/summary/paramname=strXmlPath/param/paramname=iDeleteRow要删除的行在DataSet中的Index值/parampublicstaticboolDeleteXmlRowByIndex(stringstrXmlPath,intiDeleteRow)tryDataSetds=newDataSet();ds.ReadXml(GetXmlFullPath(strXmlPath);if(ds.Tables0.Rows.Count0)/删除符号条件的行ds.Tables0.RowsiDeleteRow.Delete();ds.WriteXml(GetXmlFullPath(strXmlPath);returntrue;catch(Exception)returnfalse;#endregion 这里说一下提供此方法的原因,有的时候将XML的内容读到DataSet,然后绑定到DataGrid后,由于DataGrid中只有一个模板列,而模 板列里又套了表格等许多控件,这就使得我们可能无法得到记录对应的ID值,这个时候就可以先得到记录的Index值(第一行为0,第二行为1,以此类 推),然后将该Index值传到方法中,就可以将该记录删掉。注意:使用该方法的时候,绑定到DataGrid上的DataSet和删除时用的DataSet要为同一个,也就是说Index要相同,不能有排序,不然会误将记录。有时候我们需要删除符合条件的多行,这个时候可以用以下方法实现:#regionDeleteXmlRows/summary/删除strColumn列中值为ColumnValue的行/summary/paramname=strXmlPathxml相对路径/param/paramname=strColumn列名/param/paramname=ColumnValuestrColumn列中值为ColumnValue的行均会被删除/param/returns/returnspublicstaticboolDeleteXmlRows(stringstrXmlPath,stringstrColumn,stringColumnValue)tryDataSetds=newDataSet();ds.ReadXml(GetXmlFullPath(strXmlPath);/先判断行数if(ds.Tables0.Rows.Count0)/判断行多还是删除的值多,多的for循环放在里面if(ColumnValue.Lengthds.Tables0.Rows.Count)for(inti=0;ids.Tables0.Rows.Count;i+)for(intj=0;jColumnValue.Length;j+)/找到符合条件的行if(ds.Tables0.RowsistrColumn.ToString().Trim().Equals(ColumnValuej)/删除行ds.Tables0.Rowsi.Delete();elsefor(intj=0;jColumnValue.Length;j+)for(inti=0;ids.Tables0.Rows.Count;i+)/找到符合条件的行if(ds.Tables0.RowsistrColumn.ToString().Trim().Equals(ColumnValuej)/删除行ds.Tables0.Rowsi.Delete();ds.WriteXml(GetXmlFullPath(strXmlPath);returntrue;catch(Exception)returnfalse;#endregion3实例解析(7)读取XML以下代码读取到一个没有排序和筛选的DataSet。DataGrid1.DataSource=OperateXmlByDataSet.GetDataSetByXml(xml/xml_xmlDB.xml);DataGrid1.DataBind();以下代码读到的数据是经过筛选和排序的:DataGrid

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论