c#读取XML的几种方法_第1页
c#读取XML的几种方法_第2页
c#读取XML的几种方法_第3页
c#读取XML的几种方法_第4页
c#读取XML的几种方法_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、c#读取 xmlxml文件是一种常用的文件格式,例如winform 里面的 app.config以及 web 程序中的 web.config 文件,还有许多重要的场所都有它的身影。xml是 internet 环境中跨平台的,依赖于内容的技术, 是当前处理结构化文档信息的有力工具。xml是一种简单的数据存储语言, 使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然xml占用的空间比二进制数据要占用更多的空间,但xml极其简单易于掌握和使用。 微软也提供了一系列类库来倒帮助我们在应用程序中存储 xml文件。“ 在程序中访问进而操作xml文件一般有两种模型,分别是使用dom(文档对象

2、模型)和流模型,使用dom 的好处在于它允许编辑和更新xml文档,可以随机访问文档中的数据,可以使用xpath查询,但是, dom 的缺点在于它需要一次性的加载整个文档到内存中,对于大型的文档, 这会造成资源问题。 流模型很好的解决了这个问题,因为它对xml文件的访问采用的是流的概念,也就是说,任何时候在内存中只有当前节点,但它也有它的不足,它是只读的,仅向前的,不能在文档中执行向后导航操作。” 具体参见 在 visualc#中使用 xml指南之读取 xml下面我将介绍三种常用的读取xml文件的方法。分别是1: 使用 xmldocument2: 使用 xmltextreader3: 使用 li

3、nq to xml这里我先创建一个xml文件,名为 book.xml下面所有的方法都是基于这个xml文件的 ,文件内容如下 :1: 2: 3:4:5:数据结构 6:严蔚敏 7:30.00 8:9:10:路由型与交换型互联网基础11:程庆梅 12:27.00 13:14:15:计算机硬件技术基础 16:李继灿 17:25.00 18:19:20:软件质量保证与管理 21:朱少民 22:39.00 23:24:25:算法设计与分析 26:王红梅 27:23.00 28:29:30:计算机操作系统 31:7-111-19149-1 32:2833:34: 为了方便读取 ,我还定义一个书的实体类,名为

4、 bookmodel,具体内容如下 :1: usingsystem;2: usingsystem.collections.generic;3: usingsystem.linq;4: usingsystem.text;5:6: namespace 使用 xmldocument7: 8:publicclassbookmodel9:10:publicbookmodel()11: 12:/13:/所对应的课程类型14:/15:privatestringbooktype;16:17:publicstringbooktype18:19:get returnbooktype; 20:set booktyp

5、e = value ; 21:22:23:/24:/书所对应的 isbn号25:/26:privatestringbookisbn;27:28:publicstringbookisbn29:30:get returnbookisbn; 31:set bookisbn = value ; 32:33:34:/35:/书名36:/37:privatestringbookname;38:39:publicstringbookname40:41:get returnbookname; 42:set bookname= value ; 43:44:45:/46:/作者47:/48:privatestri

6、ngbookauthor;49:50:publicstringbookauthor51:52:get returnbookauthor;53:set bookauthor = value ; 54:55:56:/57:/价格58:/59:privatedouble bookprice;60:61:publicdouble bookprice62:63:get returnbookprice;64:set bookprice= value ;65:66:67: 1.使用 xmldocument.使用 xmldocument是一种基于文档结构模型的方式来读取xml文件.在 xml文件中 ,我们可以

7、把 xml看作是由文档声明 (declare),元素(element),属性(attribute), 文本(text)等构成的一个树 .最开始的一个结点叫作根结点,每个结点都可以有自己的子结点 .得到一个结点后 ,可以通过一系列属性或方法得到这个结点的值或其它的一些属性 .例如:1: xn 代表一个结点2: xn.name;/ 这个结点的名称3: xn.value; / 这个结点的值4: xn.childnodes; / 这个结点的所有子结点5: xn.parentnode; / 这个结点的父结点6: .1.1 读取所有的数据.使用的时候 , 首先声明一个 xmldocument 对象, 然后

8、调用 load方法, 从指定的路径加载 xml文件.1: xmldocumentdoc = new xmldocument();2: doc.load( .book.xml);然后可以通过调用 selectsinglenode得到指定的结点 ,通过 getattribute 得到具体的属性值 .参看下面的代码1: /得到根节点 bookstore2: xmlnode xn = xmldoc.selectsinglenode(bookstore );3:4:5: /得到根节点的所有子节点6: xmlnodelist xnl= xn.childnodes;7:8: foreach(xmlnode

9、xn1 inxnl)9: 10:bookmodel bookmodel = new bookmodel();11:/将节点转换为元素,便于得到节点的属性值12:xmlelement xe = (xmlelement)xn1;13:/得到 type 和 isbn两个属性的属性值14:bookmodel.bookisbn = xe.getattribute(isbn).tostring();15:bookmodel.booktype = xe.getattribute(type ).tostring();16:/得到 book节点的所有子节点17:xmlnodelist xnl0= xe.chil

10、dnodes;18:bookmodel.bookname=xnl0.item(0).innertext;19:bookmodel.bookauthor=xnl0.item(1).innertext;20:bookmodel.bookprice=convert.todouble(xnl0.item(2).innertext);21:bookmodelist.add(bookmodel);22: 23: dgvbookinfo.datasource= bookmodelist;在正常情况下 ,上面的代码好像没有什么问题,但是对于读取上面的xml文件,则会出错 ,原因就是因为我上面的xml文件里面有

11、注释 ,大家可以参看book.xml 文件中的第三行 ,我随便加的一句注释 .注释也是一种结点类型 ,在没有特别说明的情况下 ,会默认它也是一个结点 (node).所以在把结点转换成元素的时候就会报错 .无法将类型为 “system.xml.xmlcomment ”的对象强制转换为类型“ system.xml.xmlelement”。幸亏它里面自带了解决办法,那就是在读取的时候 ,告诉编译器让它忽略掉里面的注释信息 .修改如下 :1: xmldocumentxmldoc = new xmldocument();2: xmlreadersettingssettings= new xmlreade

12、rsettings();3: settings.ignorecomments= true ; / 忽略文档里面的注释4: xmlreaderreader = xmlreader.create( .book.xml, settings);5: xmldoc.load(reader);最后读取完毕后 ,记得要关掉 reader.1: reader.close();这样它就不会出现错误 .最后运行结果如下 :1.2 增加一本书的信息 .向文件中添加新的数据的时候,首先也是通过 xmldocument加载整个文档 ,然后通过调用 selectsinglenode方法获得根结点 ,通过 createel

13、ement方法创建元素 ,用createattribute 创建属性 ,用 appendchild把当前结点挂接在其它结点上,用setattributenode 设置结点的属性 .具体代码如下 :加载文件并选出要结点 :1: xmldocumentdoc = new xmldocument();2: doc.load( .book.xml);3: xmlnode root= doc.selectsinglenode(bookstore );创建一个结点 ,并设置结点的属性 :1: xmlelement xelkey = doc.createelement( book );2: xmlattri

14、butexeltype = doc.createattribute(type );3: xeltype.innertext= adfdsf;4: xelkey.setattributenode(xeltype);创建子结点 :1: xmlelement xelauthor= doc.createelement( author );2: xelauthor.innertext= dfdsa ;3: xelkey.appendchild(xelauthor);最后把 book 结点挂接在要结点上 , 并保存整个文件:1: root.appendchild(xelkey);2: doc.save(

15、.book.xml);用上面的方法 ,是向已有的文件上追加数据,如果想覆盖原有的所有数据,可以更改一下 ,使用 loadxml方法:1: xmldocumentdoc = new xmldocument();2: doc.loadxml( );/用这句话 , 会把以前的数据全部覆盖掉 , 只有你增加的数据直接把根结点选择出来了,后面不用 selectsinglenode方法选择根结点 ,直接创建结点即可 ,代码同上 .1.3 删除某一个数据想要删除某一个结点 ,直接找到其父结点 ,然后调用 removechild方法即可 ,现在关键的问题是如何找到这个结点,上面的 selectsingleno

16、de可以传入一个 xpath 表,我们通过书的 isbn号来找到这本书所在的结点.如下:1: xmlelement xe = xmldoc.documentelement; /documentelement 获取xml 文档对象的根 xmlelement.2: stringstrpath= string .format( /bookstore/bookisbn=0,dgvbookinfo.currentrow.cells1.value.tostring();3: xmlelement selectxe= (xmlelement)xe.selectsinglenode(strpath);/sel

17、ectsinglenode根据 xpath 表达式, 获得符合条件的第一个节点.4: selectxe.parentnode.removechild(selectxe);/bookstore/bookisbn=0是一个 xpath 表达式 ,找到 isbn号为所选那一行 isbn号的那本书 ,有关 xpath的知识请参考 :xpath 语法1.4 修改某要条数据修改某 条数据的话 ,首先也是用 xpath表达式找到所需要修改的那一个结点,然后如果是元素的话 ,就直接对这个元素赋值 ,如果是属性的话 ,就用 setattribute 方法设置即可 .如下:1: xmlelement xe = x

18、mldoc.documentelement; /documentelement 获取xml 文档对象的根 xmlelement.2: stringstrpath= string .format( /bookstore/bookisbn=0,dgvbookinfo.currentrow.cells1.value.tostring();3: xmlelement selectxe= (xmlelement)xe.selectsinglenode(strpath);/selectsinglenode根据 xpath 表达式, 获得符合条件的第一个节点.4: selectxe.setattribute

19、(type ,dgvbookinfo.currentrow.cells0.value.tostring();/ 也可以通过setattribute来增加一个属性5: selectxe.getelementsbytagname( title).item(0).innertext=dgvbookinfo.currentrow.cells2.value.tostring();6: selectxe.getelementsbytagname( author ).item(0).innertext=dgvbookinfo.currentrow.cells3.value.tostring();7: sel

20、ectxe.getelementsbytagname( price).item(0).innertext=dgvbookinfo.currentrow.cells4.value.tostring();8: xmldoc.save( .book.xml);2.使用 xmltextreader 和 xmltextwriterxmltextreader和 xmltextwriter 是以流的形式来读写xml文件.2.1xmltextreader使用 xmltextreader读取数据的时候 ,首先创建一个流 ,然后用 read()方法来不断的向下读 ,根据读取的结点的类型来进行相应的操作.如下:1:

21、 xmltextreader reader= new xmltextreader( .book.xml);2:listmodellist= new list();3:bookmodel model = new bookmodel();4:while(reader.read()5:6:7:if(reader.nodetype= xmlnodetype.element)8:9:if(reader.name = book )10:11:model.booktype = reader.getattribute(0);12:model.bookisbn = reader.getattribute(1);

22、13:14:if(reader.name = title)15:16:model.bookname=reader.readelementstring().trim();17:18:if(reader.name = author )19:20:model.bookauthor=reader.readelementstring().trim();21:22:if(reader.name = price)23:24:model.bookprice=convert.todouble(reader.readelementstring().trim();25:26:27:28:if(reader.node

23、type= xmlnodetype.endelement)29:30:modellist.add(model);31:model = new bookmodel();32:33:34:35:36:modellist.removeat(modellist.count-1);37:this .dgvbookinfo.datasource= modellist;关键是读取属性的时候 ,你要先知道哪一个结点具有几个属性,然后通过getattribute 方法来读取 .读取属性还可以用另外一种方法,就是用movetoattribute 方法.可参见下面的代码 :1: if(reader.name= bo

24、ok )2:3:for( inti= 0; i reader.attributecount;i+)4:5:reader.movetoattribute(i);6:stringstr= 属性: + reader.name + =+reader.value;7:8:model.booktype = reader.getattribute(0);9:model.bookisbn = reader.getattribute(1);10:效果如下 :2.2xmltextwriterxmltextwriter 写文件的时候 ,默认是覆盖以前的文件 ,如果此文件名不存在 ,它将创建此文件 .首先设置一下 ,

25、你要创建的 xml文件格式 ,1: xmltextwritermyxmltextwriter= newxmltextwriter(.book1.xml,null );2: / 使用 formatting属性指定希望将xml设定为何种格式。这样,子元素就可以通过使用indentation和 indentchar属性来缩进。3: myxmltextwriter.formatting= formatting.indented;然后可以通过 writestartelement 和 writeelementstring 方法来创建元素 ,这两者的区别就是如果有子结点的元素,那么创建的时候就用writes

26、tartelement,然后去创建子元素 ,创建完毕后 ,要调用相应的 writeendelement来告诉编译器 ,创建完毕 ,用writeelementstring 来创建单个的元素 ,用 writeattributestring 来创建属性 .如下:1: xmltextwritermyxmltextwriter= newxmltextwriter(.book1.xml,null );2:/ 使用 formatting属性指定希望将xml设定为何种格式。这样,子元素就可以通过使用indentation和 indentchar属性来缩进。3:myxmltextwriter.formattin

27、g= formatting.indented;4:5:myxmltextwriter.writestartdocument(false );6:myxmltextwriter.writestartelement(bookstore );7:8:myxmltextwriter.writecomment( 记录书本的信息 );9:myxmltextwriter.writestartelement(book );10:11:myxmltextwriter.writeattributestring(type , 选修课 );12:myxmltextwriter.writeattributestring

28、(isbn,111111111 );13:14:myxmltextwriter.writeelementstring(author , 张三);15:myxmltextwriter.writeelementstring(title, 职业生涯规划);16:myxmltextwriter.writeelementstring(price,16.00 );17:18:myxmltextwriter.writeendelement();19:myxmltextwriter.writeendelement();20:21:myxmltextwriter.flush();22:myxmltextwrit

29、er.close();3.使用 linq to xml.linq 是 c#3.0中出现的一个新特性 ,使用它可以方便的操作许多数据源,也包括xml文件.使用 linq 操作 xml文件非常的方便 ,而且也比较简单 .下面直接看代码 ,先定义 一个方法显示查询出来的数据1: privatevoidshowinfobyelements(ienumerableelements)2:3:listmodellist= new list();4:foreach(vareleinelements)5:6:bookmodel model = new bookmodel();7:model.bookauthor

30、= ele.element( author ).value;8:model.bookname= ele.element(title).value;9:model.bookprice=convert.todouble(ele.element(price).value);10:model.bookisbn=ele.attribute(isbn).value;11:model.booktype=ele.attribute(type ).value;12:13:modellist.add(model);14:15:dgvbookinfo.datasource= modellist;16:3.1 读取所

31、有的数据直接找到元素为 book 的这个结点 ,然后遍历读取所有的结果 .1: privatevoidbtnreadall_click(objectsender,eventargs e)2:3:xelement xe = xelement.load( .book.xml);4:ienumerable elements = from eleinxe.elements( book )5:selectele;6:showinfobyelements(elements);7:3.2 插入一条数据插入结点和属性都采用new的方法, 如下:1: privatevoidbtninsert_click(obj

32、ectsender,eventargs e)2:3:xelement xe = xelement.load( .book.xml);4:xelement record= new xelement(5:new xelement(book ,6:new xattribute(type , 选修课),7:new xattribute(isbn, 7-111-19149-1 ),8:new xelement(title,计算机操作系统 ),9:new xelement(author , 7-111-19149-1 ),10:new xelement(price,28.00);11:xe.add(rec

33、ord);12:xe.save( .book.xml);13:messagebox.show( 插入成功! );14:btnreadall_click(sender,e);15:3.3 删除选中的数据首先得到选中的那一行 ,通过 isbn号来找到这个元素,然后用remove方法直接删除,如下:1: privatevoidbtndelete_click(objectsender,eventargs e)2:3:if(dgvbookinfo.currentrow!= null )4:5:/dgvbookinfo.currentrow.cells1对应着 isbn号6:stringid=dgvboo

34、kinfo.currentrow.cells1.value.tostring();7:xelement xe = xelement.load( .book.xml);8:ienumerable elements = from eleinxe.elements( book )9:where( string )ele.attribute(isbn) = id10:selectele;12:11:if(elements.count() 0)13:elements.first().remove();14:15:xe.save( .book.xml);16:messagebox.show( 删除成功! );17:btnreadall_click(sender,e);18:19:20:3.4 删除所有的数据与上面的类似,选出所有的数据,然后用remove方法,如下:1: privatevoidbtndeleteall_click(objectsender,eventargs e)2:3:xele

温馨提示

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

评论

0/150

提交评论