C#读取XML的三种实现方式
前言
xml文件是一种常用的文件格式,例如winform里面的app.config以及web程序中的web.config文件,还有许多重要的场所都有它的身影。(类似还有json)微软也提供了一系列类库来倒帮助我们在应用程序中存储xml文件
在程序中访问进而操作xml文件一般有两种模型:
dom(文档对象模型):使用dom的好处在于它允许编辑和更新xml文档,可以随机访问文档中的数据,可以使用xpath查询,但是,dom的缺点在于它需要一次性的加载整个文档到内存中,对于大型的文档,这会造成资源问题。
流模型:流模型很好的解决了这个问题,因为它对xml文件的访问采用的是流的概念,也就是说,任何时候在内存中只有当前节点,但它也有它的不足,它是只读的,仅向前的,不能在文档中执行向后导航操作。
c#中三种读取xml文件方法如下:
1.使用 xmldocument(dom模式)
2.使用 xmltextreader(流模式)
3.使用 linq to xml(linq模式)
使用xmldocument方式读取
使用xmldocument是一种基于文档结构模型的方式来读取xml文件.在xml文件中,我们可以把xml看作是由文档声明(declare),元素(element),属性(attribute),文本(text)等构成的一个树.最开始的一个结点叫作根结点,每个结点都可以有自己的子结点.得到一个结点后,可以通过一系列属性或方法得到这个结点的值或其它的一些属性.例如:
xn 代表一个结点 xn.name;//这个结点的名称 xn.value;//这个结点的值 xn.childnodes;//这个结点的所有子结点 xn.parentnode;//这个结点的父结点
读取所有数据
使用的时候,首先声明一个xmldocument对象,然后调用load方法,从指定的路径加载xml文件.
bookmodel是图书模型
#region xmldocument读取 public static void xmldocumentreaddemo() { //list list<bookmodel> bookmodelist = new list<bookmodel>(); //使用的时候,首先声明一个xmldocument对象,然后调用load方法,从指定的路径加载xml文件. xmldocument doc = new xmldocument(); xmlreadersettings settings = new xmlreadersettings(); settings.ignorecomments = true;//忽略文档里面的注释 using (xmlreader reader = xmlreader.create(@"d:/demo.xml", settings)) { doc.load(reader); //doc.load(@"d:/demo.xml"); //然后可以通过调用selectsinglenode得到指定的结点,通过getattribute得到具体的属性值.参看下面的代码 // 得到根节点bookstore xmlnode xn = doc.selectsinglenode("bookstore"); // 得到根节点的所有子节点 xmlnodelist xnl = xn.childnodes; foreach (xmlnode xn1 in xnl) { bookmodel bookmodel = new bookmodel(); // 将节点转换为元素,便于得到节点的属性值 xmlelement xe = (xmlelement)xn1; // 得到type和isbn两个属性的属性值 bookmodel.bookisbn = xe.getattribute("isbn").tostring(); bookmodel.booktype = xe.getattribute("type").tostring(); // 得到book节点的所有子节点 xmlnodelist xnl0 = xe.childnodes; bookmodel.bookname = xnl0.item(0).innertext; bookmodel.bookauthor = xnl0.item(1).innertext; bookmodel.bookprice = convert.todouble(xnl0.item(2).innertext); bookmodelist.add(bookmodel); } } bookmodelist.add(new bookmodel()); } #endregion xmldocument读取
运行结果如下:
使用xmltextreader方式读取
使用xmltextreader读取数据的时候,首先创建一个流,然后用read()方法来不断的向下读,根据读取的结点的类型来进行相应的操作.如下:
#region xmltextreaderdemo public static void xmltextreaderdemo() { xmltextreader reader = new xmltextreader(@"d:/demo.xml"); list<bookmodel> modellist = new list<bookmodel>(); bookmodel model = new bookmodel(); while (reader.read()) { if (reader.nodetype == xmlnodetype.element) { if (reader.name == "book") { model.booktype = reader.getattribute("type"); model.bookisbn = reader.getattribute("isbn"); } if (reader.name == "title") { model.bookname = reader.readelementcontentasstring(); } if (reader.name == "author") { model.bookauthor = reader.readelementstring().trim(); } if (reader.name == "price") { model.bookprice = convert.todouble(reader.readelementstring().trim()); } //for(int i=0;i<reader.attributecount;i++) //{ // reader.movetoattribute(i); //} } if (reader.nodetype == xmlnodetype.endelement) { modellist.add(model); model = new bookmodel(); } } reader.close(); modellist.add(new bookmodel()); } #endregion xmltextreaderdemo
使用 linq to xml读取
linq是c#3.0中出现的一个新特性,使用它可以方便的操作许多数据源,也包括xml文件.使用linq操作xml文件非常的方便,而且也比较简单。
必须引用using system.linq;using system.xml.linq;
#region 读取所有的数据 xelement xe = xelement.load(@"d:/demolinq.xml"); //xe.descendants var elements = from ele in xe.elements() select ele; list<bookmodel> modellist = new list<bookmodel>(); foreach (var ele in elements) { bookmodel model = new bookmodel(); model.bookauthor = ele.element("author").value; model.bookname = ele.element("title").value; model.bookprice = convert.todouble(ele.element("price").value); model.bookisbn = ele.attribute("isbn").value; model.booktype = ele.attribute("type").value; modellist.add(model); } modellist.add(new bookmodel()); #endregion 读取所有的数据
总结
1.xmldocument方法优点是便于查找
2.xmltextreader方法是流读取内存暂用少
3.linq to xml 最新方法也是推荐方法,代码少易于理解
源码下载:consoleapplication_jb51.rar
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
下一篇: 瘦子如何丰满上围 不做“小”女人