好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://HdhCmsTestcnblogs测试数据/wxc-kingsley/p/Xml-002.html

dy("nrwz");

查看更多关于C#读取XML的三种实现方式的详细内容...

  阅读:57次