c#操作XML文件的通用方法
本文导读:我们在编写C#程序时,经常会通过C#访问XML文件,实现对XML文档的读写操作。下面为大家列出了通用的调用方法,大家可以将这些方法放在共用类里,其它的程序共享调用就可以了。
下面通过一个类将我们平时用c#操作XML文件的通用方法详细的介绍一下,关于asp.net C#操作xml文档实现代码,大家可以参考参考。
c# 代码
View Code
1 sing System; 2 using System.Data; 3 using System.Configuration; 4 using System.Web; 5 using System.Web.Security; 6 using System.Web.UI; 7 using System.Web.UI.WebControls; 8 using System.Web.UI.WebControls.WebParts; 9 using System.Web.UI.HtmlControls; 10 using System.Xml; 11 using System.Collections; 12 using System.IO; 13 14 15 public class XMLHealper 16 { 17 构造函数#region 构造函数 18 public XMLHealper() 19 { 20 FilePath = XMLPath.GetXMLPath(); 21 OpenXML(); 22 } 23 #endregion 24 25 对象定义#region 对象定义 26 27 private XmlDocument xmlDoc = new XmlDocument(); 28 XmlNode xmlnode; 29 XmlElement xmlelem; 30 31 #endregion 32 33 属性定义#region 属性定义 34 35 private string errorMess; 36 public string ErrorMess 37 { 38 get { return errorMess; } 39 set { errorMess = value; } 40 } 41 42 private string filePath; 43 public string FilePath 44 { 45 set { filePath = value; } 46 get { return filePath; } 47 } 48 49 #endregion 50 51 加载XML文件,创建操作对象#region 加载XML文件,创建操作对象 52 /**//// <summary> 53 /// 加载XML文件,创建操作对象 54 /// </summary> 55 public void OpenXML() 56 { 57 try 58 { 59 if (!string.IsNullOrEmpty(FilePath)) 60 { 61 xmlDoc.Load(filePath); 62 } 63 else 64 { 65 FilePath = string.Format(@"D:\XMLExample.xml"); //默认路径 66 xmlDoc.Load(filePath); 67 } 68 } 69 catch (Exception ex) 70 { 71 ErrorMess = ex; 72 } 73 } 74 #endregion 75 76 创建Xml 文档#region 创建Xml 文档 77 /**//// <summary> 78 /// 创建一个带有根节点的Xml 文件 79 /// </summary> 80 /// <param name="FileName">Xml 文件名称</param> 81 /// <param name="rootName">根节点名称</param> 82 /// <param name="Encode">编码方式:gb2312,UTF-8 等常见的</param> 83 /// <param name="DirPath">保存的目录路径</param> 84 /// <returns></returns> 85 public bool CreatexmlDocument(string FileName, string rootName, string Encode) 86 { 87 try 88 { 89 XmlDeclaration xmldecl; 90 xmldecl = xmlDoc.CreateXmlDeclaration("1.0", Encode, null); 91 xmlDoc.AppendChild(xmldecl); 92 xmlelem = xmlDoc.CreateElement("", rootName, ""); 93 xmlDoc.AppendChild(xmlelem); 94 xmlDoc.Save(FileName); 95 return true; 96 } 97 catch (Exception e) 98 { 99 return false; 100 } 101 } 102 #endregion 103 104 得到数据表#region 得到数据表 105 /**//// <summary> 106 /// 得到数据表 107 /// </summary> 108 /// <returns></returns> 109 public DataView GetData() 110 { 111 xmlDoc = new XmlDocument(); 112 DataSet ds = new DataSet(); 113 StringReader read = new StringReader(xmlDoc.SelectSingleNode(FilePath).OuterXml); 114 ds.ReadXml(read); 115 return ds.Tables[0].DefaultView; 116 } 117 #endregion 118 119 读取指定节点的指定属性值#region 读取指定节点的指定属性值 120 /**//// <summary> 121 /// 功能: 122 /// 读取指定节点的指定属性值 123 /// </summary> 124 /// <param name="strNode">节点名称(相对路径://+节点名称)</param> 125 /// <param name="strAttribute">此节点的属性</param> 126 /// <returns></returns> 127 public string GetXmlNodeValue(string strNode, string strAttribute) 128 { 129 string strReturn = ""; 130 try 131 { 132 //根据指定路径获取节点 133 XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode); 134 //获取节点的属性,并循环取出需要的属性值 135 XmlAttributeCollection xmlAttr = xmlNode.Attributes; 136 137 for (int i = 0; i < xmlAttr.Count; i++) 138 { 139 if (xmlAttr.Item(i).Name == strAttribute) 140 { 141 strReturn = xmlAttr.Item(i).Value; 142 } 143 } 144 } 145 catch (XmlException xmle) 146 { 147 throw xmle; 148 } 149 return strReturn; 150 } 151 #endregion 152 153 读取指定节点的值#region 读取指定节点的值 154 /**//// <summary> 155 /// 读取指定节点的值 156 /// </summary> 157 /// <param name="strNode">节点名称</param> 158 /// <returns></returns> 159 public string GetXmlNodeValue(string strNode) 160 { 161 string strReturn = String.Empty; 162 try 163 { 164 //根据路径获取节点 165 XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode); 166 strReturn = xmlNode.InnerText; 167 } 168 catch (XmlException xmle) 169 { 170 System.Console.WriteLine(xmle.Message); 171 } 172 return strReturn; 173 } 174 #endregion 175 176 获取XML文件的根元素#region 获取XML文件的根元素 177 /**//// <summary> 178 /// 获取XML文件的根元素 179 /// </summary> 180 public XmlNode GetXmlRoot() 181 { 182 return xmlDoc.DocumentElement; 183 } 184 #endregion 185 186 获取XML节点值#region 获取XML节点值 187 /**//// <summary> 188 /// 获取XML节点值 189 /// </summary> 190 /// <param name="nodeName"></param> 191 /// <returns></returns> 192 public string GetNodeValue(string nodeName) 193 { 194 xmlDoc = new XmlDocument(); 195 xmlDoc.Load(FilePath); 196 197 XmlNodeList xnl = xmlDoc.ChildNodes; 198 foreach (XmlNode xnf in xnl) 199 { 200 XmlElement xe = (XmlElement)xnf; 201 XmlNodeList xnf1 = xe.ChildNodes; 202 foreach (XmlNode xn2 in xnf1) 203 { 204 if (xn2.InnerText == nodeName) 205 { 206 XmlElement xe2 = (XmlElement)xn2; 207 return xe2.GetAttribute("value"); 208 } 209 } 210 } 211 return null; 212 } 213 #endregion 214 215 216 设置节点值#region 设置节点值 217 /**//// <summary> 218 /// 功能: 219 /// 设置节点值 220 /// </summary> 221 /// <param name="strNode">节点的名称</param> 222 /// <param name="newValue">节点值</param> 223 public void SetXmlNodeValue(string xmlNodePath, string xmlNodeValue) 224 { 225 try 226 { 227 //根据指定路径获取节点 228 XmlNode xmlNode = xmlDoc.SelectSingleNode(xmlNodePath); 229 //设置节点值 230 xmlNode.InnerText = xmlNodeValue; 231 } 232 catch (XmlException xmle) 233 { 234 throw xmle; 235 } 236 } 237 #endregion 238 239 添加父节点#region 添加父节点 240 241 /**//// <summary> 242 /// 在根节点下添加父节点 243 /// </summary> 244 public void AddParentNode(string parentNode) 245 { 246 XmlNode root = GetXmlRoot(); 247 XmlNode parentXmlNode = xmlDoc.CreateElement(parentNode); 248 249 root.AppendChild(parentXmlNode); 250 } 251 #endregion 252 253 向一个已经存在的父节点中插入一个子节点#region 向一个已经存在的父节点中插入一个子节点 254 /**//// <summary> 255 /// 向一个已经存在的父节点中插入一个子节点 256 /// </summary> 257 public void AddChildNode(string parentNodePath, string childNodePath) 258 { 259 XmlNode parentXmlNode = xmlDoc.SelectSingleNode(parentNodePath); 260 XmlNode childXmlNode = xmlDoc.CreateElement(childNodePath); 261 262 parentXmlNode.AppendChild(childXmlNode); 263 } 264 #endregion 265 266 向一个节点添加属性#region 向一个节点添加属性 267 /**//// <summary> 268 /// 向一个节点添加属性 269 /// </summary> 270 public void AddAttribute(string NodePath, string NodeAttribute) 271 { 272 XmlAttribute nodeAttribute = xmlDoc.CreateAttribute(NodeAttribute); 273 XmlNode nodePath = xmlDoc.SelectSingleNode(NodePath); 274 nodePath.Attributes.Append(nodeAttribute); 275 } 276 #endregion 277 278 插入一个节点和它的若干子节点#region 插入一个节点和它的若干子节点 279 /**//// <summary> 280 /// 插入一个节点和它的若干子节点 281 /// </summary> 282 /// <param name="NewNodeName">插入的节点名称</param> 283 /// <param name="HasAttributes">此节点是否具有属性,True 为有,False 为无</param> 284 /// <param name="fatherNode">此插入节点的父节点</param> 285 /// <param name="htAtt">此节点的属性,Key 为属性名,Value 为属性值</param> 286 /// <param name="htSubNode"> 子节点的属性, Key 为Name,Value 为InnerText</param> 287 /// <returns>返回真为更新成功,否则失败</returns> 288 public bool InsertNode(string NewNodeName, bool HasAttributes, string fatherNode, Hashtable htAtt, Hashtable htSubNode) 289 { 290 try 291 { 292 xmlDoc.Load(FilePath); 293 XmlNode root = xmlDoc.SelectSingleNode(fatherNode); 294 xmlelem = xmlDoc.CreateElement(NewNodeName); 295 if (htAtt != null && HasAttributes)//若此节点有属性,则先添加属性 296 { 297 SetAttributes(xmlelem, htAtt); 298 AddNodes(xmlelem.Name, xmlDoc, xmlelem, htSubNode);//添加完此节点属性后,再添加它的子节点和它们的InnerText 299 } 300 else 301 { 302 AddNodes(xmlelem.Name, xmlDoc, xmlelem, htSubNode);//若此节点无属性,那么直接添加它的子节点 303 } 304 root.AppendChild(xmlelem); 305 xmlDoc.Save(FilePath); 306 return true; 307 } 308 catch (Exception e) 309 { 310 throw new Exception(e.Message); 311 } 312 } 313 #endregion 314 315 设置节点属性#region 设置节点属性 316 /**//// <summary> 317 /// 设置节点属性 318 /// </summary> 319 /// <param name="xe">节点所处的Element</param> 320 /// <param name="htAttribute">节点属性,Key 代表属性名称,Value 代表属性值</param> 321 public void SetAttributes(XmlElement xe, Hashtable htAttribute) 322 { 323 foreach (DictionaryEntry de in htAttribute) 324 { 325 xe.SetAttribute(de.Key.ToString(), de.Value.ToString()); 326 } 327 } 328 #endregion 329 330 增加子节点到根节点下#region 增加子节点到根节点下 331 /**//// <summary> 332 /// 增加子节点到根节点下 333 /// </summary> 334 /// <param name="rootNode">上级节点名称</param> 335 /// <param name="xmlDoc">Xml 文档</param> 336 /// <param name="rootXe">父根节点所属的Element</param> 337 /// <param name="SubNodes">子节点属性,Key 为Name 值,Value 为InnerText 值</param> 338 public void AddNodes(string rootNode, XmlDocument xmlDoc, XmlElement rootXe, Hashtable SubNodes) 339 { 340 foreach (DictionaryEntry de in SubNodes) 341 { 342 xmlnode = xmlDoc.SelectSingleNode(rootNode); 343 XmlElement subNode = xmlDoc.CreateElement(de.Key.ToString()); 344 subNode.InnerText = de.Value.ToString(); 345 rootXe.AppendChild(subNode); 346 } 347 } 348 #endregion 349 350 //更新 351 352 设置节点的属性值#region 设置节点的属性值 353 /**//// <summary> 354 /// 功能: 355 /// 设置节点的属性值 356 /// </summary> 357 /// <param name="xmlNodePath">节点名称</param> 358 /// <param name="xmlNodeAttribute">属性名称</param> 359 /// <param name="xmlNodeAttributeValue">属性值</param> 360 public void SetXmlNodeValue(string xmlNodePath, string xmlNodeAttribute, string xmlNodeAttributeValue) 361 { 362 try 363 { 364 //根据指定路径获取节点 365 XmlNode xmlNode = xmlDoc.SelectSingleNode(xmlNodePath); 366 367 //获取节点的属性,并循环取出需要的属性值 368 XmlAttributeCollection xmlAttr = xmlNode.Attributes; 369 for (int i = 0; i < xmlAttr.Count; i++) 370 { 371 if (xmlAttr.Item(i).Name == xmlNodeAttribute) 372 { 373 xmlAttr.Item(i).Value = xmlNodeAttributeValue; 374 break; 375 } 376 } 377 } 378 catch (XmlException xmle) 379 { 380 throw xmle; 381 } 382 } 383 384 #endregion 385 386 更新节点#region 更新节点 387 /**//// <summary> 388 /// 更新节点 389 /// </summary> 390 /// <param name="fatherNode">需要更新节点的上级节点</param> 391 /// <param name="htAtt">需要更新的属性表,Key 代表需要更新的属性,Value 代表更新后的值</param> 392 /// <param name="htSubNode">需要更新的子节点的属性表,Key 代表需要更新的子节点名字Name,Value 代表更新后的值InnerText</param> 393 /// <returns>返回真为更新成功,否则失败</returns> 394 public bool UpdateNode(string fatherNode, Hashtable htAtt, Hashtable htSubNode) 395 { 396 try 397 { 398 xmlDoc = new XmlDocument(); 399 xmlDoc.Load(FilePath); 400 XmlNodeList root = xmlDoc.SelectSingleNode(fatherNode).ChildNodes; 401 UpdateNodes(root, htAtt, htSubNode); 402 xmlDoc.Save(FilePath); 403 return true; 404 } 405 catch (Exception e) 406 { 407 throw new Exception(e.Message); 408 } 409 } 410 #endregion 411 412 更新节点属性和子节点InnerText 值#region 更新节点属性和子节点InnerText 值 413 /**//// <summary> 414 /// 更新节点属性和子节点InnerText 值 415 /// </summary> 416 /// <param name="root">根节点名字</param> 417 /// <param name="htAtt">需要更改的属性名称和值</param> 418 /// <param name="htSubNode">需要更改InnerText 的子节点名字和值</param> 419 public void UpdateNodes(XmlNodeList root, Hashtable htAtt, Hashtable htSubNode) 420 { 421 foreach (XmlNode xn in root) 422 { 423 xmlelem = (XmlElement)xn; 424 if (xmlelem.HasAttributes)//如果节点如属性,则先更改它的属性 425 { 426 foreach (DictionaryEntry de in htAtt)//遍历属性哈希表 427 { 428 if (xmlelem.HasAttribute(de.Key.ToString()))//如果节点有需要更改的属性 429 { 430 xmlelem.SetAttribute(de.Key.ToString(), de.Value.ToString());//则把哈希表中相应的值Value 赋给此属性Key 431 } 432 } 433 } 434 if (xmlelem.HasChildNodes)//如果有子节点,则修改其子节点的InnerText 435 { 436 XmlNodeList xnl = xmlelem.ChildNodes; 437 foreach (XmlNode xn1 in xnl) 438 { 439 XmlElement xe = (XmlElement)xn1; 440 foreach (DictionaryEntry de in htSubNode) 441 { 442 if (xe.Name == de.Key.ToString())//htSubNode 中的key 存储了需要更改的节点名称, 443 { 444 xe.InnerText = de.Value.ToString();//htSubNode中的Value存储了Key 节点更新后的数据 445 } 446 } 447 } 448 } 449 } 450 } 451 #endregion 452 453 454 删除一个节点的属性#region 删除一个节点的属性 455 /**//// <summary> 456 /// 删除一个节点的属性 457 /// </summary> 458 public void DeleteAttribute(string NodePath, string NodeAttribute, string NodeAttributeValue) 459 { 460 XmlNodeList nodePath = xmlDoc.SelectSingleNode(NodePath).ChildNodes; 461 462 foreach (XmlNode xn in nodePath) 463 { 464 XmlElement xe = (XmlElement)xn; 465 466 if (xe.GetAttribute(NodeAttribute) == NodeAttributeValue) 467 { 468 xe.RemoveAttribute(NodeAttribute);//删除属性 469 } 470 } 471 } 472 473 #endregion 474 475 删除一个节点#region 删除一个节点 476 /**//// <summary> 477 /// 删除一个节点 478 /// </summary> 479 public void DeleteXmlNode(string tempXmlNode) 480 { 481 XmlNode xmlNodePath = xmlDoc.SelectSingleNode(tempXmlNode); 482 xmlNodePath.ParentNode.RemoveChild(xmlNodePath); 483 } 484 485 #endregion 486 487 删除指定节点下的子节点#region 删除指定节点下的子节点 488 /**//// <summary> 489 /// 删除指定节点下的子节点 490 /// </summary> 491 /// <param name="fatherNode">制定节点</param> 492 /// <returns>返回真为更新成功,否则失败</returns> 493 public bool DeleteNodes(string fatherNode) 494 { 495 try 496 { 497 xmlDoc = new XmlDocument(); 498 xmlDoc.Load(FilePath); 499 xmlnode = xmlDoc.SelectSingleNode(fatherNode); 500 xmlnode.RemoveAll(); 501 xmlDoc.Save(FilePath); 502 return true; 503 } 504 catch (XmlException xe) 505 { 506 throw new XmlException(xe.Message); 507 } 508 } 509 #endregion 510 511 512 私有函数#region 私有函数 513 514 private string functionReturn(XmlNodeList xmlList, int i, string nodeName) 515 { 516 string node = xmlList[i].ToString(); 517 string rusultNode = ""; 518 for (int j = 0; j < i; j++) 519 { 520 if (node == nodeName) 521 { 522 rusultNode = node.ToString(); 523 } 524 else 525 { 526 if (xmlList[j].HasChildNodes) 527 { 528 functionReturn(xmlList, j, nodeName); 529 } 530 else 531 { 532 break; 533 } 534 } 535 } 536 return rusultNode; 537 538 539 } 540 541 #endregion 542 543 保存XML文件#region 保存XML文件 544 /**//// <summary> 545 /// 功能: 546 /// 保存XML文件 547 /// 548 /// </summary> 549 public void SavexmlDocument() 550 { 551 try 552 { 553 xmlDoc.Save(FilePath); 554 } 555 catch (XmlException xmle) 556 { 557 throw xmle; 558 } 559 } 560 /**//// <summary> 561 /// 功能: 保存XML文件 562 /// </summary> 563 /// <param name="tempXMLFilePath"></param> 564 public void SavexmlDocument(string tempXMLFilePath) 565 { 566 try 567 { 568 xmlDoc.Save(tempXMLFilePath); 569 } 570 catch (XmlException xmle) 571 { 572 throw xmle; 573 } 574 } 575 #endregion 576 } 577 578