c#操作xml文件(XmlDocument,XmlTextReader,Linq To Xml)

主界面

1         /// <summary>
2         /// xml文件路径
3         /// </summary>
4         public const string XmlPath = "test.xml";
常量
1         //数据表
2         DataTable dataTable;
属性
  1         /// <summary>
  2         /// 生成数据表
  3         /// </summary>
  4         private void getTable()
  5         {
  6             dataTable = new DataTable();
  7             dataTable.Columns.Add(new DataColumn("课程类型"));
  8             dataTable.Columns.Add(new DataColumn("ISBN号"));
  9             dataTable.Columns.Add(new DataColumn("名称"));
 10             dataTable.Columns.Add(new DataColumn("作者"));
 11             dataTable.Columns.Add(new DataColumn("价格"));
 12         }
 13 
 14         /// <summary>
 15         /// 生成一个新增行 请保证已生成Table再生成
 16         /// </summary>
 17         private DataRow getAddRow()
 18         {
 19             Random rd = new Random();
 20             DataRow addDr = dataTable.NewRow();
 21             addDr["课程类型"] = "新增课程类型";
 22             addDr["ISBN号"] = Guid.NewGuid().ToString();
 23             addDr["名称"] = "新增名称";
 24             addDr["作者"] = "新增作者";
 25             addDr["价格"] = (Math.Round(rd.NextDouble() * 100, 2)).ToString();
 26             return addDr;
 27         }
 28 
 29         /// <summary>
 30         /// 生成一个修改行 请保证已生成Table再生成
 31         /// </summary>
 32         /// <param name="ISBN">编号</param>
 33         private DataRow getModifiyRow(string ISBN)
 34         {
 35             Random rd = new Random();
 36             DataRow modifiyDr = dataTable.NewRow();
 37             modifiyDr["课程类型"] = "修改课程类型";
 38             modifiyDr["ISBN号"] = ISBN;
 39             modifiyDr["名称"] = "修改名称";
 40             modifiyDr["作者"] = "修改作者";
 41             modifiyDr["价格"] = (Math.Round(rd.NextDouble() * 100, 2)).ToString();
 42             return modifiyDr;
 43         }
 44 
 45         /// <summary>
 46         /// 获取用户选中行的ISBN
 47         /// </summary>
 48         private string getSelectISBN()
 49         {
 50             try
 51             {
 52                 return dgvData.CurrentRow.Cells[1].Value.ToString();
 53             }
 54             catch
 55             {
 56                 return "";
 57             }
 58         }
 59 
 60         /// <summary>
 61         /// 重置数据并写入xml文件 - XmlTextWriter
 62         /// </summary>
 63         /// <returns></returns>
 64         private void resetData()
 65         {
 66             //创建编写器
 67             XmlTextWriter writer = new XmlTextWriter(XmlPath, Encoding.UTF8);
 68             //使子元素可用知道方式缩进
 69             writer.Formatting = Formatting.Indented;
 70             //是否写1.0声明
 71             writer.WriteStartDocument(true);
 72             //编写元素 bookstore
 73             writer.WriteStartElement("bookstore");
 74             //备注
 75             writer.WriteComment("记录书本的信息");
 76 
 77             //book1
 78             writer.WriteStartElement("book");
 79             //添加属性
 80             writer.WriteAttributeString("Type", "选修课");
 81             writer.WriteAttributeString("ISBN", "7-111-19149-1");
 82             //添加指定文本的元素
 83             writer.WriteElementString("title", "计算机操作系统");
 84             writer.WriteElementString("author", "高飞");
 85             writer.WriteElementString("price", "28.00");
 86             //结束标签
 87             writer.WriteEndElement();
 88 
 89             //book2
 90             writer.WriteStartElement("book");
 91             //添加属性
 92             writer.WriteAttributeString("Type", "必修课");
 93             writer.WriteAttributeString("ISBN", "7-111-19149-2");
 94             //添加指定文本的元素
 95             writer.WriteElementString("title", "数据结构");
 96             writer.WriteElementString("author", "严蔚敏");
 97             writer.WriteElementString("price", "30.00");
 98             //结束标签
 99             writer.WriteEndElement();
100 
101             //book3
102             writer.WriteStartElement("book");
103             //添加属性
104             writer.WriteAttributeString("Type", "必修课");
105             writer.WriteAttributeString("ISBN", "7-111-19149-3");
106             //添加指定文本的元素
107             writer.WriteElementString("title", "路由型与交换型互联网基础");
108             writer.WriteElementString("author", "程庆梅");
109             writer.WriteElementString("price", "27.00");
110             //结束标签
111             writer.WriteEndElement();
112 
113             //book4
114             writer.WriteStartElement("book");
115             //添加属性
116             writer.WriteAttributeString("Type", "必修课");
117             writer.WriteAttributeString("ISBN", "7-111-19149-4");
118             //添加指定文本的元素
119             writer.WriteElementString("title", "计算机硬件技术基础");
120             writer.WriteElementString("author", "李继灿");
121             writer.WriteElementString("price", "25.00");
122             //结束标签
123             writer.WriteEndElement();
124 
125             //book5
126             writer.WriteStartElement("book");
127             //添加属性
128             writer.WriteAttributeString("Type", "必修课");
129             writer.WriteAttributeString("ISBN", "7-111-19149-5");
130             //添加指定文本的元素
131             writer.WriteElementString("title", "软件质量保证与管理");
132             writer.WriteElementString("author", "朱少民");
133             writer.WriteElementString("price", "39.00");
134             //结束标签
135             writer.WriteEndElement();
136 
137             //book6
138             writer.WriteStartElement("book");
139             //添加属性
140             writer.WriteAttributeString("Type", "必修课");
141             writer.WriteAttributeString("ISBN", "7-111-19149-6");
142             //添加指定文本的元素
143             writer.WriteElementString("title", "算法设计与分析");
144             writer.WriteElementString("author", "王红梅");
145             writer.WriteElementString("price", "23.00");
146             //结束标签
147             writer.WriteEndElement();
148 
149             //bookstore结束标签
150             writer.WriteEndElement();
151 
152             //备注
153             writer.WriteComment("此为恢复出厂设置结果");
154             writer.WriteComment("妈咪妈咪哄~");
155 
156             //刷新
157             writer.Flush();
158             //关闭
159             if (writer != null) { writer.Close(); writer.Dispose(); }
160 
161             MessageBox.Show("恢复出厂设置成功~");
162             dgvData.DataSource = null;
163         }
私有方法
  1         //XmlDocument
  2         XmlDocument xDoc;
  3 
  4         /// <summary>
  5         /// 加载数据到表格 XmlDocument
  6         /// </summary>
  7         public void XmlDocumentLoadData()
  8         {
  9             //创建结构表格
 10             getTable();
 11             //创建文档
 12             xDoc = new XmlDocument();
 13             //读取设置
 14             XmlReaderSettings xrs = new XmlReaderSettings();
 15             //忽略注释
 16             xrs.IgnoreComments = true;
 17             //读取xml
 18             XmlReader xr = XmlReader.Create(XmlPath, xrs);
 19             //加载到文档
 20             xDoc.Load(xr);
 21             //获取第一个节点
 22             XmlNode xNode = xDoc.SelectSingleNode("bookstore");
 23             //获取其所有子节点
 24             XmlNodeList xnList = xNode.ChildNodes;
 25 
 26             //遍历所有子节点
 27             foreach (XmlNode xnItem in xnList)
 28             {
 29                 //新建一行
 30                 DataRow dr = dataTable.NewRow();
 31                 //转换成元素以方便获取属性值
 32                 XmlElement xe = (XmlElement)xnItem;
 33                 dr["课程类型"] = xe.GetAttribute("Type");
 34                 dr["ISBN号"] = xe.GetAttribute("ISBN");
 35 
 36                 //获取book下子节点
 37                 XmlNodeList cxnList = xnItem.ChildNodes;
 38                 dr["名称"] = cxnList.Item(0).InnerText;
 39                 dr["作者"] = cxnList.Item(1).InnerText;
 40                 dr["价格"] = cxnList.Item(2).InnerText;
 41 
 42                 //加入表格
 43                 dataTable.Rows.Add(dr);
 44             }
 45 
 46             //绑定数据
 47             dgvData.DataSource = dataTable;
 48 
 49             if (xr != null) { xr.Close(); xr.Dispose(); }
 50         }
 51 
 52         /// <summary>
 53         /// 新增一行
 54         /// </summary>
 55         public void XmlDocumentAdd()
 56         {
 57             if (dgvData.DataSource == null)
 58                 throw new Exception("未加载数据源!");
 59 
 60             if (xDoc == null)
 61                 throw new Exception("请先使用XmlDocument加载数据!");
 62 
 63             //获取新增行数据
 64             DataRow addDr = getAddRow();
 65             //获取商店节点
 66             XmlNode xn = xDoc.SelectSingleNode("bookstore");
 67 
 68             //创建书节点
 69             XmlElement xe = xDoc.CreateElement("book");
 70 
 71             //添加属性
 72             xe.SetAttribute("Type", addDr["课程类型"].ToString());
 73             xe.SetAttribute("ISBN", addDr["ISBN号"].ToString());
 74 
 75             //创建书节点
 76             XmlElement xe2 = xDoc.CreateElement("title");
 77             xe2.InnerText = addDr["名称"].ToString();
 78             XmlElement xe3 = xDoc.CreateElement("author");
 79             xe3.InnerText = addDr["作者"].ToString();
 80             XmlElement xe4 = xDoc.CreateElement("price");
 81             xe4.InnerText = addDr["价格"].ToString();
 82 
 83             //子节点添加到book中
 84             xe.AppendChild(xe2);
 85             xe.AppendChild(xe3);
 86             xe.AppendChild(xe4);
 87 
 88             //book添加到bookstore中
 89             xn.AppendChild(xe);
 90 
 91             //保存修改
 92             XmlDocumentSave();
 93 
 94             //重新加载
 95             XmlDocumentLoadData();
 96         }
 97 
 98         /// <summary>
 99         /// 修改一行
100         /// </summary>
101         public void XmlDocumentModifiy()
102         {
103             if (dgvData.DataSource == null)
104                 throw new Exception("未加载数据源!");
105 
106             if (xDoc == null)
107                 throw new Exception("请先使用XmlDocument加载数据!");
108 
109             //获取商店
110             XmlNode xn = xDoc.SelectSingleNode("bookstore");
111 
112             //获取所有书
113             XmlNodeList xnl = xn.ChildNodes;
114 
115             //获取选中行id
116             string selectId = getSelectISBN();
117             //是否选中
118             if (string.IsNullOrEmpty(selectId))
119             {
120                 throw new Exception("没有要修改的数据!");
121             }
122 
123             //遍历所有书
124             foreach (XmlNode item in xnl)
125             {
126                 XmlElement xe = (XmlElement)item;
127                 if (xe.GetAttribute("ISBN").Equals(selectId))
128                 {
129                     //获取修改行数据
130                     DataRow modifiyDr = getModifiyRow(selectId);
131                     //改变书属性值
132                     xe.SetAttribute("Type", modifiyDr["课程类型"].ToString());
133 
134                     //获取书下所有节点并修改
135                     XmlNodeList cxnList = item.ChildNodes;
136                     cxnList.Item(0).InnerText = modifiyDr["名称"].ToString();
137                     cxnList.Item(1).InnerText = modifiyDr["作者"].ToString();
138                     cxnList.Item(2).InnerText = modifiyDr["价格"].ToString();
139 
140                     break;
141                 }
142             }
143 
144             //保存修改
145             XmlDocumentSave();
146 
147             //重新加载
148             XmlDocumentLoadData();
149         }
150 
151         /// <summary>
152         /// 删除一行
153         /// </summary>
154         private void XmlDocumentDelete()
155         {
156             if (dgvData.DataSource == null)
157                 throw new Exception("未加载数据源!");
158 
159             if (xDoc == null)
160                 throw new Exception("请先使用XmlDocument加载数据!");
161 
162             //获取商店
163             XmlNode xn = xDoc.SelectSingleNode("bookstore");
164 
165             //获取所有书
166             XmlNodeList xnl = xn.ChildNodes;
167 
168             //获取选中行id
169             string selectId = getSelectISBN();
170 
171             //是否选中
172             if (string.IsNullOrEmpty(selectId))
173             {
174                 throw new Exception("没有要删除的数据!");
175             }
176 
177             //遍历所有书
178             foreach (XmlNode item in xnl)
179             {
180                 XmlElement xe = (XmlElement)item;
181                 if (xe.GetAttribute("ISBN").Equals(selectId))
182                 {
183                     xn.RemoveChild(item);
184                     break;
185                 }
186             }
187 
188             //保存修改
189             XmlDocumentSave();
190 
191             //重新加载
192             XmlDocumentLoadData();
193         }
194 
195         /// <summary>
196         /// 保存xml
197         /// </summary>
198         private void XmlDocumentSave()
199         {
200             xDoc.Save(XmlPath);
201         }
XmlDocument
  1         XmlTextReader reader;
  2 
  3         /// <summary>
  4         /// 加载数据到表格 XmlTextReader
  5         /// </summary>
  6         public void XmlTextReaderLoadData()
  7         {
  8             //创建结构表格
  9             getTable();
 10 
 11             //创建阅读器
 12             reader = new XmlTextReader(XmlPath);
 13 
 14             //新建一列(循环开始前新建是为了避免不必要的新建)
 15             DataRow dr = dataTable.NewRow();
 16 
 17             //开始读取(从上到下一个个节点读取 
 18             //例:﹤author﹥高飞﹤/author﹥这会看成3个节点
 19             //1.﹤author﹥->XmlNodeType.Element 2.高飞->XmlNodeType.Text 3.﹤/author﹥->XmlNodeType.EndElement)
 20             while (reader.Read())
 21             {
 22                 //如果是元素
 23                 if (reader.NodeType == XmlNodeType.Element)
 24                 {
 25                     //读到书
 26                     if (reader.Name == "book")
 27                     {
 28                         dr["课程类型"] = reader.GetAttribute("Type");
 29                         dr["ISBN号"] = reader.GetAttribute("ISBN");
 30                     }
 31 
 32                     //读到标题
 33                     if (reader.Name == "title")
 34                     {
 35                         dr["名称"] = reader.ReadString();
 36                     }
 37 
 38                     //读到作者
 39                     if (reader.Name == "author")
 40                     {
 41                         dr["作者"] = reader.ReadString();
 42                     }
 43 
 44                     //读到价格
 45                     if (reader.Name == "price")
 46                     {
 47                         dr["价格"] = reader.ReadString();
 48                     }
 49                 }
 50 
 51                 //如果book一个对象读取完了添加一行
 52                 if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "book")
 53                 {
 54                     dataTable.Rows.Add(dr);
 55                     dr = dataTable.NewRow();
 56                 }
 57             }
 58 
 59             //绑定数据
 60             dgvData.DataSource = dataTable;
 61 
 62             if (reader != null) { reader.Close(); reader.Dispose(); }
 63         }
 64 
 65         /// <summary>
 66         /// 新增一行
 67         /// </summary>
 68         public void XmlTextReaderAdd()
 69         {
 70             if (dgvData.DataSource == null)
 71                 throw new Exception("未加载数据源!");
 72 
 73             //提示
 74             DialogResult dr = MessageBox.Show("小弟无能,实现不了,只能覆盖,追加不了!那覆盖了哈?", "提示", MessageBoxButtons.OKCancel);
 75             //取消不做事
 76             if (dr == DialogResult.Cancel)
 77             {
 78                 return;
 79             }
 80             //创建编写器
 81             XmlTextWriter writer = new XmlTextWriter(XmlPath, Encoding.UTF8);
 82             //使子元素可用知道方式缩进
 83             writer.Formatting = Formatting.Indented;
 84             //是否写1.0声明
 85             writer.WriteStartDocument(true);
 86             //编写元素 bookstore
 87             writer.WriteStartElement("bookstore");
 88 
 89             //book
 90             writer.WriteStartElement("book");
 91             //添加属性
 92             writer.WriteAttributeString("Type", "覆盖课程类型");
 93             writer.WriteAttributeString("ISBN", "7-111-19149-1");
 94             //添加指定文本的元素
 95             writer.WriteElementString("title", "覆盖课程名称");
 96             writer.WriteElementString("author", "覆盖作者");
 97             writer.WriteElementString("price", "0.00");
 98             //结束标签
 99             writer.WriteEndElement();
100             //bookstore结束
101             writer.WriteEndElement();
102 
103             //刷新
104             writer.Flush();
105             //关闭
106             if (writer != null) { writer.Close(); writer.Dispose(); }
107 
108             //重新加载
109             XmlTextReaderLoadData();
110         }
XmlTextReader
  1         XElement xe;
  2 
  3         /// <summary>
  4         /// 加载数据到表格 Linq to Xml
  5         /// </summary>
  6         public void LinqLoadData()
  7         {
  8             //创建结构表格
  9             getTable();
 10             //初始化
 11             xe = XElement.Load(XmlPath);
 12 
 13             //查出需要的数据并组合list
 14             var query = (from item in xe.Elements("book")//或xe.Descendants("book")
 15                          select new
 16                          {
 17                              Type = item.Attribute("Type").Value,
 18                              ISBN = item.Attribute("ISBN").Value,
 19                              Title = item.Element("title").Value,
 20                              Author = item.Element("author").Value,
 21                              Price = item.Element("price").Value
 22                          }).ToList();
 23 
 24             foreach (var item in query)
 25             {
 26                 //新增行
 27                 DataRow dr = dataTable.NewRow();
 28 
 29                 //加数据
 30                 dr["课程类型"] = item.Type;
 31                 dr["ISBN号"] = item.ISBN;
 32                 dr["名称"] = item.Title;
 33                 dr["作者"] = item.Author;
 34                 dr["价格"] = item.Price;
 35 
 36                 //添加行
 37                 dataTable.Rows.Add(dr);
 38             }
 39 
 40             //绑定数据源
 41             dgvData.DataSource = dataTable;
 42         }
 43 
 44         /// <summary>
 45         /// 新增一行
 46         /// </summary>
 47         public void LinqAdd()
 48         {
 49             if (dgvData.DataSource == null)
 50                 throw new Exception("未加载数据源!");
 51 
 52             if (xe == null)
 53                 throw new Exception("请先使用Linq To Xml加载数据!");
 54 
 55             //获取新增行数据
 56             DataRow addDr = getAddRow();
 57 
 58             //新建一个book
 59             XElement newXe = new XElement(
 60                 new XElement("book",
 61                     new XAttribute("Type", addDr["课程类型"]),
 62                     new XAttribute("ISBN", addDr["ISBN号"]),
 63                     new XElement("title", addDr["名称"]),
 64                     new XElement("author", addDr["作者"]),
 65                     new XElement("price", addDr["价格"])
 66                     ));
 67 
 68             //新增一个
 69             xe.Add(newXe);
 70 
 71             //保存
 72             LinqSave();
 73 
 74             //重新加载
 75             LinqLoadData();
 76 
 77         }
 78 
 79         /// <summary>
 80         /// 修改一行
 81         /// </summary>
 82         public void LinqModifiy()
 83         {
 84             if (dgvData.DataSource == null)
 85                 throw new Exception("未加载数据源!");
 86 
 87             if (xe == null)
 88                 throw new Exception("请先使用Linq To Xml加载数据!");
 89 
 90             //获取选中行id
 91             string selectId = getSelectISBN();
 92 
 93             //是否选中
 94             if (string.IsNullOrEmpty(selectId))
 95             {
 96                 throw new Exception("没有要修改的数据!");
 97             }
 98 
 99             //生成修改行
100             DataRow dr = getModifiyRow(selectId);
101 
102             //找到要修改的数据
103             var query = (from item in xe.Elements("book")
104                          where item.Attribute("ISBN").Value == selectId
105                          select item).ToList();
106 
107             if (query.Count < 1)
108             {
109                 throw new Exception("没有要修改的数据!");
110             }
111 
112             //提出行
113             XElement mXe = query[0];
114 
115             //修改属性
116             mXe.SetAttributeValue("Type", dr["课程类型"]);
117             mXe.SetAttributeValue("ISBN", dr["ISBN号"]);
118 
119             //修改行
120             mXe.SetElementValue("title", dr["名称"]);
121             mXe.SetElementValue("author", dr["作者"]);
122             mXe.SetElementValue("price", dr["价格"]);
123 
124             //保存
125             LinqSave();
126 
127             //重新加载
128             LinqLoadData();
129         }
130 
131         /// <summary>
132         /// 删除一行
133         /// </summary>
134         private void LinqDelete()
135         {
136             if (dgvData.DataSource == null)
137                 throw new Exception("未加载数据源!");
138 
139             if (xe == null)
140                 throw new Exception("请先使用Linq To Xml加载数据!");
141 
142             //获取选中行id
143             string selectId = getSelectISBN();
144 
145             //是否选中
146             if (string.IsNullOrEmpty(selectId))
147             {
148                 throw new Exception("没有要删除的数据!");
149             }
150 
151             //找到要删除的数据
152             var query = (from item in xe.Elements("book")
153                          where item.Attribute("ISBN").Value == selectId
154                          select item).ToList();
155 
156             //移除
157             query.Remove();
158 
159             //保存
160             LinqSave();
161 
162             //重新加载
163             LinqLoadData();
164 
165         }
166 
167         /// <summary>
168         /// 保存xml
169         /// </summary>
170         private void LinqSave()
171         {
172             xe.Save(XmlPath);
173         }
Linq To Xml

 参考:http://www.cnblogs.com/a1656344531/archive/2012/11/28/2792863.html

posted @ 2016-03-14 11:11  开拓丿飞  阅读(1629)  评论(0编辑  收藏  举报