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 }
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 }
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 }
参考:http://www.cnblogs.com/a1656344531/archive/2012/11/28/2792863.html