C#读取XML文件的方法

先写一个xml文件:

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <bookste>
 3   <!--记录书本的信息-->
 4   <book Type="必修课" ISBN="7-111-19149-2">
 5     <title>编译原理</title>
 6     <auth>佚名</auth>
 7     <price>30.00</price>
 8   </book>
 9 
10   <book Type="选修课" ISBN="7-111-19149-1">
11     <title>计算机操作系统</title>
12     <auth>test</auth>
13     <price>28.00</price>
14   </book>
15 </bookste>
View Code

1.使用XmlDocument

      使用XmlDocument来读取XML文件.在XML文件中,我们可以把XML看作是由文档声明(Declare),元素 (Element),属性(Attribute),文本(Text)等构成的一个树.最开始的一个结点叫作根结点,每个结点都可以有自己的子结点.得到一 个结点后,可以通过一系列属性或方法得到这个结点的值或其它的一些属性.例如:

   1: xn 代表一个结点
   2: xn.Name;//这个结点的名称
   3: xn.Value;//这个结点的值
   4: xn.ChildNodes;//这个结点的所有子结点
   5: xn.ParentNode;//这个结点的父结点,等等...
 1 1.1 读取所有的数据.
 2 使用的时候,首先声明一个XmlDocument对象,然后调用Load方法,从指定的路径加载XML文件.
 3 
 4 1: XmlDocument doc = new XmlDocument();
 5 2: doc.Load(@"..\..\Book.xml");
 6 
 7 然后可以通过调用SelectSingleNode得到指定的结点,通过GetAttribute得到具体的属性值.参看下面的代码
 8 
 9  // 得到根节点bookste
10 
11  XmlNode xn = xmlDoc.SelectSingleNode("bookste");
12 
13  // 得到根节点的所有子节点
14 
15  XmlNodeList xnl = xn.ChildNodes;
16 
17  feach (XmlNode xn1 in xnl)
18 
19 {
20 
21   BookModel bookModel = new BookModel();
22 
23   // 将节点转换为元素,便于得到节点的属性值
24 
25    XmlElement xe = (XmlElement)xn1;
26 
27     // 得到ISBN两个属性的属性值
28 
29     var isnb = xe.GetAttribute("ISBN").ToString();
30 
31     // 得到Book节点的所有子节点
32 
33    XmlNodeList xnl0 = xe.ChildNodes;
34 
35     var name=xnl0.Item(0).InnerText;
36  }
View Code

     在正常情况下,上面的代码好像没有什么问题,但是对于读取上面的XML文件,则会出错,原因就是上面的XML文件里面有注释,在没有特别说明的情况下,会默认它也是一个结点(Node).所以在把结点转换成元素的时候就会报错."无法将类型为“System.Xml.XmlComment”的对象强制转换为类型 “System.Xml.XmlElement”。"解决方法如下,和newtonsoft.json这个库类似。

 XmlDocument xmlDoc = new XmlDocument();

 XmlReaderSettings settings = new XmlReaderSettings();

 settings.IgneComments = true;//忽略文档里面的注释

 XmlReader reader = XmlReader.Create(@"..\..\Book.xml", settings);

 xmlDoc.Load(reader);
View Code

2.使用XmlTextReader和XmlTextWriter

XmlTextReader和XmlTextWriter是以流的形式来读写XML文件.使用XmlTextReader读取数据的时候,首先创建一个流,然后用read()方法来不断的向下读,根据读取的结点的类型来进行相应的操作.如下:

以后继续....

 

posted @ 2014-11-18 16:31  梦锁湘江  阅读(377)  评论(0编辑  收藏  举报