XmlConfigUtil.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Xml;
  5. namespace OTSIncAReportTemplate
  6. {
  7. /// <summary>
  8. /// XML操作类
  9. /// </summary>
  10. public class XmlConfigUtil
  11. {
  12. #region 全局变量
  13. string _xmlPath; //文件所在路径
  14. #endregion
  15. #region 构造函数
  16. /// <summary>
  17. /// 初始化一个配置
  18. /// </summary>
  19. /// <param name="xmlPath">配置所在路径</param>
  20. public XmlConfigUtil(string xmlPath)
  21. {
  22. _xmlPath = Path.GetFullPath(xmlPath);
  23. }
  24. #endregion
  25. #region 公有方法
  26. /// <summary>
  27. /// 写入配置,也可以用来修改
  28. /// </summary>
  29. /// <param name="value">写入的值</param>
  30. /// <param name="nodes">节点</param>
  31. public void Write(string value, params string[] nodes)
  32. {
  33. //初始化xml
  34. XmlDocument xmlDoc = new XmlDocument();
  35. if (File.Exists(_xmlPath))
  36. xmlDoc.Load(_xmlPath);
  37. else
  38. xmlDoc.LoadXml("<XmlConfig />");
  39. XmlNode xmlRoot = xmlDoc.ChildNodes[0];
  40. //新增、编辑 节点
  41. string xpath = string.Join("/", nodes);
  42. XmlNode node = xmlDoc.SelectSingleNode(xpath);
  43. if (node == null) //新增节点
  44. {
  45. node = makeXPath(xmlDoc, xmlRoot, xpath);
  46. }
  47. node.InnerText = value;
  48. //保存
  49. xmlDoc.Save(_xmlPath);
  50. }
  51. /// <summary>
  52. /// 设置节点上属性的值
  53. /// </summary>
  54. /// <param name="AttributeName">属性名</param>
  55. /// <param name="AttributeValue">属性值</param>
  56. /// <param name="nodes">选择节点</param>
  57. public void SetAttribute(string AttributeName, string AttributeValue, params string[] nodes)
  58. {
  59. //初始化xml
  60. XmlDocument xmlDoc = new XmlDocument();
  61. if (File.Exists(_xmlPath))
  62. xmlDoc.Load(_xmlPath);
  63. else
  64. xmlDoc.LoadXml("<XmlConfig />");
  65. XmlNode xmlRoot = xmlDoc.ChildNodes[0];
  66. //新增、编辑 节点
  67. string xpath = string.Join("/", nodes);
  68. XmlElement element = (XmlElement)xmlDoc.SelectSingleNode(xpath);
  69. if (element == null) //新增节点
  70. {
  71. element = (XmlElement)makeXPath(xmlDoc, xmlRoot, xpath);
  72. }
  73. //设置节点上属性的值
  74. element.SetAttribute(AttributeName, AttributeValue);
  75. //保存
  76. xmlDoc.Save(_xmlPath);
  77. }
  78. public string GetAttribute(string AttributeName, params string[] nodes)
  79. {
  80. //初始化xml
  81. XmlDocument xmlDoc = new XmlDocument();
  82. if (File.Exists(_xmlPath))
  83. xmlDoc.Load(_xmlPath);
  84. else
  85. xmlDoc.LoadXml("<XmlConfig />");
  86. XmlNode xmlRoot = xmlDoc.ChildNodes[0];
  87. //新增、编辑 节点
  88. string xpath = string.Join("/", nodes);
  89. XmlElement element = (XmlElement)xmlDoc.SelectSingleNode(xpath);
  90. if (element == null) //新增节点
  91. {
  92. element = (XmlElement)makeXPath(xmlDoc, xmlRoot, xpath);
  93. }
  94. //设置节点上属性的值
  95. string retstr = element.GetAttribute(AttributeName);
  96. //保存
  97. xmlDoc.Save(_xmlPath);
  98. return retstr;
  99. }
  100. /// <summary>
  101. /// 读取配置
  102. /// </summary>
  103. /// <param name="nodes">节点</param>
  104. /// <returns></returns>
  105. public string Read(params string[] nodes)
  106. {
  107. XmlDocument xmlDoc = new XmlDocument();
  108. if (File.Exists(_xmlPath) == false)
  109. return null;
  110. else
  111. xmlDoc.Load(_xmlPath);
  112. string xpath = string.Join("/", nodes);
  113. XmlNode node = xmlDoc.SelectSingleNode("/XmlConfig/" + xpath);
  114. if (node == null)
  115. return null;
  116. return node.InnerText;
  117. }
  118. /// <summary>
  119. /// 删除节点
  120. /// </summary>
  121. /// <param name="nodes"></param>
  122. public void RemoveNode(params string[] nodes)
  123. {
  124. XmlDocument xmlDoc = new XmlDocument();
  125. if (File.Exists(_xmlPath) == false)
  126. return;
  127. else
  128. xmlDoc.Load(_xmlPath);
  129. string xpath = string.Join("/", nodes);
  130. XmlNode node = xmlDoc.SelectSingleNode("/XmlConfig/" + xpath);
  131. //取得父节点
  132. string[] father_nodes = new string[nodes.Count() - 1];
  133. //对父节点进行初始化
  134. for (int i = 0; i < nodes.Count() - 1; i++)
  135. {
  136. father_nodes[i] = (string)nodes[i].Clone();
  137. }
  138. string fast_xpath = string.Join("/", father_nodes);
  139. XmlNode fastnode = xmlDoc.SelectSingleNode("/XmlConfig/" + fast_xpath);
  140. if (node == null)
  141. return;
  142. if (fastnode == null)
  143. return;
  144. //使用父节点删除子节点
  145. fastnode.RemoveChild(node);
  146. //保存
  147. xmlDoc.Save(_xmlPath);
  148. }
  149. #endregion
  150. #region 私有方法
  151. //递归根据 xpath 的方式进行创建节点
  152. static private XmlNode makeXPath(XmlDocument doc, XmlNode parent, string xpath)
  153. {
  154. // 在XPath抓住下一个节点的名称;父级如果是空的则返回
  155. string[] partsOfXPath = xpath.Trim('/').Split('/');
  156. string nextNodeInXPath = partsOfXPath.First();
  157. if (string.IsNullOrEmpty(nextNodeInXPath))
  158. return parent;
  159. // 获取或从名称创建节点
  160. XmlNode node = parent.SelectSingleNode(nextNodeInXPath);
  161. if (node == null)
  162. node = parent.AppendChild(doc.CreateElement(nextNodeInXPath));
  163. // 加入的阵列作为一个XPath表达式和递归余数
  164. string rest = String.Join("/", partsOfXPath.Skip(1).ToArray());
  165. return makeXPath(doc, node, rest);
  166. }
  167. #endregion
  168. }
  169. }