XmlHelper.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. using ProjectBase.Data.Encrypt;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Runtime.Serialization;
  8. using System.Runtime.Serialization.Formatters.Binary;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using System.Xml;
  12. using System.Xml.Serialization;
  13. namespace ProjectBase.Data.XML
  14. {
  15. /// <summary>
  16. /// XML序列号、反序列化、节点等操作类辅助类
  17. /// </summary>
  18. public class XmlHelper
  19. {
  20. #region 变量
  21. /// <summary>
  22. /// XML文件路径
  23. /// </summary>
  24. protected string strXmlFile;
  25. /// <summary>
  26. /// XmlDocument对象
  27. /// </summary>
  28. protected XmlDocument objXmlDoc = new XmlDocument();
  29. #endregion
  30. /// <summary>
  31. /// 构造函数
  32. /// </summary>
  33. /// <param name="XmlFile">XML文件路径</param>
  34. public XmlHelper(string XmlFile)
  35. {
  36. try
  37. {
  38. objXmlDoc.Load(XmlFile);
  39. }
  40. catch (System.Exception ex)
  41. {
  42. throw ex;
  43. }
  44. strXmlFile = XmlFile;
  45. }
  46. #region 静态方法
  47. /// <summary>
  48. /// 二进制序列化
  49. /// </summary>
  50. /// <param name="path">文件路径</param>
  51. /// <param name="obj">对象实例</param>
  52. /// <returns></returns>
  53. public static bool Serialize(string path, object obj)
  54. {
  55. try
  56. {
  57. using (Stream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
  58. {
  59. IFormatter format = new BinaryFormatter();
  60. format.Serialize(stream, obj);
  61. stream.Close();
  62. }
  63. return true;
  64. }
  65. catch
  66. {
  67. return false;
  68. }
  69. }
  70. /// <summary>
  71. /// XML序列化
  72. /// </summary>
  73. /// <param name="path">文件路径</param>
  74. /// <param name="obj">对象实例</param>
  75. /// <param name="type">对象类型</param>
  76. /// <returns></returns>
  77. public static bool XmlSerialize(string path, object obj, Type type)
  78. {
  79. try
  80. {
  81. if (!File.Exists(path))
  82. {
  83. FileInfo fi = new FileInfo(path);
  84. if (!fi.Directory.Exists)
  85. {
  86. Directory.CreateDirectory(fi.Directory.FullName);
  87. }
  88. }
  89. XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
  90. ns.Add("", "");
  91. using (Stream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
  92. {
  93. XmlSerializer format = new XmlSerializer(type);
  94. format.Serialize(stream, obj, ns);
  95. stream.Close();
  96. }
  97. return true;
  98. }
  99. catch (Exception ex)
  100. {
  101. Console.WriteLine(ex.Message);
  102. return false;
  103. }
  104. }
  105. /// <summary>
  106. /// 二进制反序列化
  107. /// </summary>
  108. /// <param name="path">文件路径</param>
  109. /// <returns></returns>
  110. public static object Deserialize(string path)
  111. {
  112. try
  113. {
  114. using (Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
  115. {
  116. IFormatter formatter = new BinaryFormatter();
  117. stream.Seek(0, SeekOrigin.Begin);
  118. object obj = formatter.Deserialize(stream);
  119. stream.Close();
  120. return obj;
  121. }
  122. }
  123. catch
  124. {
  125. return null;
  126. }
  127. }
  128. /// <summary>
  129. /// XML反序列化
  130. /// </summary>
  131. /// <param name="path">文件路径</param>
  132. /// <param name="type">对象类型</param>
  133. /// <returns></returns>
  134. public static object XmlDeserialize(string path, Type type)
  135. {
  136. try
  137. {
  138. using (Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
  139. {
  140. XmlSerializer formatter = new XmlSerializer(type);
  141. stream.Seek(0, SeekOrigin.Begin);
  142. object obj = formatter.Deserialize(stream);
  143. stream.Close();
  144. return obj;
  145. }
  146. }
  147. catch
  148. {
  149. return null;
  150. }
  151. }
  152. #endregion
  153. #region 公用方法
  154. /// <summary>
  155. /// 获取指定节点下面的XML子节点
  156. /// </summary>
  157. /// <param name="XmlPathNode">XML节点</param>
  158. /// <returns></returns>
  159. public XmlNodeList Read(string XmlPathNode)
  160. {
  161. try
  162. {
  163. XmlNode xn = objXmlDoc.SelectSingleNode(XmlPathNode);
  164. return xn.ChildNodes;
  165. }
  166. catch (Exception ex)
  167. {
  168. throw ex;
  169. }
  170. }
  171. /// <summary>
  172. /// 读取节点属性内容
  173. /// </summary>
  174. /// <param name="XmlPathNode">XML节点</param>
  175. /// <param name="Attrib">节点属性</param>
  176. /// <returns></returns>
  177. public string Read(string XmlPathNode, string Attrib)
  178. {
  179. string value = "";
  180. try
  181. {
  182. XmlNode xn = objXmlDoc.SelectSingleNode(XmlPathNode);
  183. value = (Attrib.Equals("") ? xn.InnerText : xn.Attributes[Attrib].Value);
  184. }
  185. catch (Exception ex)
  186. {
  187. throw ex;
  188. }
  189. return value;
  190. }
  191. /// <summary>
  192. /// 获取元素节点对象
  193. /// </summary>
  194. /// <param name="XmlPathNode">XML节点</param>
  195. /// <param name="elementName">元素节点名称</param>
  196. /// <returns></returns>
  197. public XmlElement GetElement(string XmlPathNode, string elementName)
  198. {
  199. XmlElement result = null;
  200. XmlNode nls = objXmlDoc.SelectSingleNode(XmlPathNode);
  201. foreach (XmlNode xn1 in nls)//遍历
  202. {
  203. XmlElement xe2 = (XmlElement)xn1;//转换类型
  204. if (xe2.Name == elementName)//如果找到
  205. {
  206. result = xe2;
  207. break;//找到退出来就可以了
  208. }
  209. }
  210. return result;
  211. }
  212. /// <summary>
  213. /// 获取元素节点的值
  214. /// </summary>
  215. /// <param name="XmlPathNode">XML节点</param>
  216. /// <param name="elementName">元素节点名称</param>
  217. /// <returns></returns>
  218. public string GetElementData(string XmlPathNode, string elementName)
  219. {
  220. string result = null;
  221. XmlNode nls = objXmlDoc.SelectSingleNode(XmlPathNode);
  222. foreach (XmlNode xn1 in nls)//遍历
  223. {
  224. XmlElement xe2 = (XmlElement)xn1;//转换类型
  225. if (xe2.Name == elementName)//如果找到
  226. {
  227. result = xe2.InnerText;
  228. break;//找到退出来就可以了
  229. }
  230. }
  231. return result;
  232. }
  233. /// <summary>
  234. /// 获取节点下的DataSet
  235. /// </summary>
  236. /// <param name="XmlPathNode">XML节点</param>
  237. /// <returns></returns>
  238. public DataSet GetData(string XmlPathNode)
  239. {
  240. DataSet ds = new DataSet();
  241. StringReader read = new StringReader(objXmlDoc.SelectSingleNode(XmlPathNode).OuterXml);
  242. ds.ReadXml(read);
  243. return ds;
  244. }
  245. /// <summary>
  246. /// 替换某节点的内容
  247. /// </summary>
  248. /// <param name="XmlPathNode">XML节点</param>
  249. /// <param name="Content">节点内容</param>
  250. public void Replace(string XmlPathNode, string Content)
  251. {
  252. objXmlDoc.SelectSingleNode(XmlPathNode).InnerText = Content;
  253. }
  254. /// <summary>
  255. /// 删除节点
  256. /// </summary>
  257. /// <param name="Node">节点</param>
  258. public void Delete(string Node)
  259. {
  260. string mainNode = Node.Substring(0, Node.LastIndexOf("/"));
  261. objXmlDoc.SelectSingleNode(mainNode).RemoveChild(objXmlDoc.SelectSingleNode(Node));
  262. }
  263. /// <summary>
  264. /// 插入一节点和此节点的一子节点
  265. /// </summary>
  266. /// <param name="MainNode"></param>
  267. /// <param name="ChildNode"></param>
  268. /// <param name="Element"></param>
  269. /// <param name="Content"></param>
  270. public void InsertNode(string MainNode, string ChildNode, string Element, string Content)
  271. {
  272. XmlNode objRootNode = objXmlDoc.SelectSingleNode(MainNode);
  273. XmlElement objChildNode = objXmlDoc.CreateElement(ChildNode);
  274. objRootNode.AppendChild(objChildNode);
  275. XmlElement objElement = objXmlDoc.CreateElement(Element);
  276. objElement.InnerText = Content;
  277. objChildNode.AppendChild(objElement);
  278. }
  279. /// <summary>
  280. /// 插入一个节点带一个属性
  281. /// </summary>
  282. /// <param name="MainNode">指定的XML节点</param>
  283. /// <param name="Element">元素名称</param>
  284. /// <param name="Attrib">属性名称</param>
  285. /// <param name="AttribContent">属性值</param>
  286. /// <param name="Content">内容</param>
  287. public void InsertElement(string MainNode, string Element, string Attrib, string AttribContent, string Content)
  288. {
  289. XmlNode objNode = objXmlDoc.SelectSingleNode(MainNode);
  290. XmlElement objElement = objXmlDoc.CreateElement(Element);
  291. objElement.SetAttribute(Attrib, AttribContent);
  292. objElement.InnerText = Content;
  293. objNode.AppendChild(objElement);
  294. }
  295. /// <summary>
  296. /// 插入XML元素
  297. /// </summary>
  298. /// <param name="MainNode">指定的XML节点</param>
  299. /// <param name="Element">元素名称</param>
  300. /// <param name="Content">内容</param>
  301. public void InsertElement(string MainNode, string Element, string Content)
  302. {
  303. XmlNode objNode = objXmlDoc.SelectSingleNode(MainNode);
  304. XmlElement objElement = objXmlDoc.CreateElement(Element);
  305. objElement.InnerText = Content;
  306. objNode.AppendChild(objElement);
  307. }
  308. /// <summary>
  309. /// 保存XML文档
  310. /// </summary>
  311. public void Save()
  312. {
  313. try
  314. {
  315. objXmlDoc.Save(strXmlFile);
  316. }
  317. catch (System.Exception ex)
  318. {
  319. throw ex;
  320. }
  321. objXmlDoc = null;
  322. }
  323. /// <summary>
  324. /// XML序列化并对文件进行加密
  325. /// </summary>
  326. /// <param name="path">文件路径</param>
  327. /// <param name="obj">对象实例</param>
  328. /// <param name="type">对象类型</param>
  329. /// <returns></returns>
  330. public bool XmlSerializeEncrypt(string path, object obj, Type type)
  331. {
  332. XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
  333. ns.Add("", "");
  334. try
  335. {
  336. if (!File.Exists(path))
  337. {
  338. FileInfo fi = new FileInfo(path);
  339. if (!fi.Directory.Exists)
  340. {
  341. Directory.CreateDirectory(fi.Directory.FullName);
  342. }
  343. }
  344. using (Stream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
  345. {
  346. string content = "";
  347. using (MemoryStream ms = new MemoryStream())
  348. {
  349. XmlSerializer format = new XmlSerializer(type);
  350. format.Serialize(ms, obj, ns);
  351. ms.Seek(0, 0);
  352. content = Encoding.ASCII.GetString(ms.ToArray());
  353. }
  354. string encrypt = EncodeHelper.EncryptString(content);
  355. byte[] bytes = UTF8Encoding.Default.GetBytes(encrypt);
  356. stream.Write(bytes, 0, bytes.Length);
  357. stream.Close();
  358. }
  359. return true;
  360. }
  361. catch (Exception ex)
  362. {
  363. Console.WriteLine(ex.Message);
  364. return false;
  365. }
  366. }
  367. /// <summary>
  368. /// XML反序列化并解密
  369. /// </summary>
  370. /// <param name="path">文件路径</param>
  371. /// <param name="type">对象类型</param>
  372. /// <returns></returns>
  373. public object XmlDeserializeDecrypt(string path, Type type)
  374. {
  375. try
  376. {
  377. string encrypt = File.ReadAllText(path, Encoding.UTF8);
  378. string content = EncodeHelper.DecryptString(encrypt, true);
  379. byte[] bytes = UTF8Encoding.Default.GetBytes(content);
  380. using (MemoryStream stream = new MemoryStream(bytes))
  381. {
  382. XmlSerializer formatter = new XmlSerializer(type);
  383. stream.Seek(0, SeekOrigin.Begin);
  384. object obj = formatter.Deserialize(stream);
  385. stream.Close();
  386. return obj;
  387. }
  388. }
  389. catch (Exception ex)
  390. {
  391. Console.WriteLine(ex.Message);
  392. return null;
  393. }
  394. }
  395. #endregion
  396. }
  397. }