XMLProcess.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  1. using System;
  2. using System.Data;
  3. using System.IO;
  4. using System.Xml;
  5. namespace Ant.Service.Utilities
  6. {
  7. public class XMLProcess
  8. {
  9. #region 构造函数
  10. public XMLProcess()
  11. { }
  12. public XMLProcess(string strPath)
  13. {
  14. this._XMLPath = strPath;
  15. }
  16. #endregion
  17. #region 公有属性
  18. private string _XMLPath;
  19. public string XMLPath
  20. {
  21. get { return this._XMLPath; }
  22. }
  23. #endregion
  24. #region 私有方法
  25. /// <summary>
  26. /// 导入XML文件
  27. /// </summary>
  28. /// <param name="XMLPath">XML文件路径</param>
  29. private XmlDocument XMLLoad()
  30. {
  31. string XMLFile = XMLPath;
  32. XmlDocument xmldoc = new XmlDocument();
  33. try
  34. {
  35. string filename = AppDomain.CurrentDomain.BaseDirectory.ToString() + XMLFile;
  36. if (File.Exists(filename)) xmldoc.Load(filename);
  37. }
  38. catch (Exception e)
  39. { }
  40. return xmldoc;
  41. }
  42. /// <summary>
  43. /// 导入XML文件
  44. /// </summary>
  45. /// <param name="XMLPath">XML文件路径</param>
  46. private static XmlDocument XMLLoad(string strPath)
  47. {
  48. XmlDocument xmldoc = new XmlDocument();
  49. try
  50. {
  51. string filename = AppDomain.CurrentDomain.BaseDirectory.ToString() + strPath;
  52. if (File.Exists(filename)) xmldoc.Load(filename);
  53. }
  54. catch (Exception e)
  55. { }
  56. return xmldoc;
  57. }
  58. /// <summary>
  59. /// 返回完整路径
  60. /// </summary>
  61. /// <param name="strPath">Xml的路径</param>
  62. private static string GetXmlFullPath(string strPath)
  63. {
  64. if (strPath.IndexOf(":") > 0)
  65. {
  66. return strPath;
  67. }
  68. else
  69. {
  70. return System.Web.HttpContext.Current.Server.MapPath(strPath);
  71. }
  72. }
  73. #endregion
  74. #region 读取数据
  75. /// <summary>
  76. /// 读取指定节点的数据
  77. /// </summary>
  78. /// <param name="node">节点</param>
  79. /// 使用示列:
  80. /// XMLProsess.Read("/Node", "")
  81. /// XMLProsess.Read("/Node/Element[@Attribute='Name']")
  82. public string Read(string node)
  83. {
  84. string value = "";
  85. try
  86. {
  87. XmlDocument doc = XMLLoad();
  88. XmlNode xn = doc.SelectSingleNode(node);
  89. value = xn.InnerText;
  90. }
  91. catch { }
  92. return value;
  93. }
  94. /// <summary>
  95. /// 读取指定路径和节点的串联值
  96. /// </summary>
  97. /// <param name="path">路径</param>
  98. /// <param name="node">节点</param>
  99. /// <param name="attribute">属性名,非空时返回该属性值,否则返回串联值</param>
  100. /// 使用示列:
  101. /// XMLProsess.Read(path, "/Node", "")
  102. /// XMLProsess.Read(path, "/Node/Element[@Attribute='Name']")
  103. public static string Read(string path, string node)
  104. {
  105. string value = "";
  106. try
  107. {
  108. XmlDocument doc = XMLLoad(path);
  109. XmlNode xn = doc.SelectSingleNode(node);
  110. value = xn.InnerText;
  111. }
  112. catch { }
  113. return value;
  114. }
  115. /// <summary>
  116. /// 读取指定路径和节点的属性值
  117. /// </summary>
  118. /// <param name="path">路径</param>
  119. /// <param name="node">节点</param>
  120. /// <param name="attribute">属性名,非空时返回该属性值,否则返回串联值</param>
  121. /// 使用示列:
  122. /// XMLProsess.Read(path, "/Node", "")
  123. /// XMLProsess.Read(path, "/Node/Element[@Attribute='Name']", "Attribute")
  124. public static string Read(string path, string node, string attribute)
  125. {
  126. string value = "";
  127. try
  128. {
  129. XmlDocument doc = XMLLoad(path);
  130. XmlNode xn = doc.SelectSingleNode(node);
  131. value = (attribute.Equals("") ? xn.InnerText : xn.Attributes[attribute].Value);
  132. }
  133. catch { }
  134. return value;
  135. }
  136. /// <summary>
  137. /// 获取某一节点的所有孩子节点的值
  138. /// </summary>
  139. /// <param name="node">要查询的节点</param>
  140. public string[] ReadAllChildallValue(string node)
  141. {
  142. int i = 0;
  143. string[] str = { };
  144. XmlDocument doc = XMLLoad();
  145. XmlNode xn = doc.SelectSingleNode(node);
  146. XmlNodeList nodelist = xn.ChildNodes; //得到该节点的子节点
  147. if (nodelist.Count > 0)
  148. {
  149. str = new string[nodelist.Count];
  150. foreach (XmlElement el in nodelist)//读元素值
  151. {
  152. str[i] = el.Value;
  153. i++;
  154. }
  155. }
  156. return str;
  157. }
  158. /// <summary>
  159. /// 获取某一节点的所有孩子节点的值
  160. /// </summary>
  161. /// <param name="node">要查询的节点</param>
  162. public XmlNodeList ReadAllChild(string node)
  163. {
  164. XmlDocument doc = XMLLoad();
  165. XmlNode xn = doc.SelectSingleNode(node);
  166. XmlNodeList nodelist = xn.ChildNodes; //得到该节点的子节点
  167. return nodelist;
  168. }
  169. /// <summary>
  170. /// 读取XML返回经排序或筛选后的DataView
  171. /// </summary>
  172. /// <param name="strWhere">筛选条件,如:"name='kgdiwss'"</param>
  173. /// <param name="strSort"> 排序条件,如:"Id desc"</param>
  174. public DataView GetDataViewByXml(string strWhere, string strSort)
  175. {
  176. try
  177. {
  178. string XMLFile = this.XMLPath;
  179. string filename = AppDomain.CurrentDomain.BaseDirectory.ToString() + XMLFile;
  180. DataSet ds = new DataSet();
  181. ds.ReadXml(filename);
  182. DataView dv = new DataView(ds.Tables[0]); //创建DataView来完成排序或筛选操作
  183. if (strSort != null)
  184. {
  185. dv.Sort = strSort; //对DataView中的记录进行排序
  186. }
  187. if (strWhere != null)
  188. {
  189. dv.RowFilter = strWhere; //对DataView中的记录进行筛选,找到我们想要的记录
  190. }
  191. return dv;
  192. }
  193. catch (Exception)
  194. {
  195. return null;
  196. }
  197. }
  198. /// <summary>
  199. /// 读取XML返回DataSet
  200. /// </summary>
  201. /// <param name="strXmlPath">XML文件相对路径</param>
  202. public DataSet GetDataSetByXml(string strXmlPath)
  203. {
  204. try
  205. {
  206. DataSet ds = new DataSet();
  207. ds.ReadXml(GetXmlFullPath(strXmlPath));
  208. if (ds.Tables.Count > 0)
  209. {
  210. return ds;
  211. }
  212. return null;
  213. }
  214. catch (Exception)
  215. {
  216. return null;
  217. }
  218. }
  219. #endregion
  220. #region 插入数据
  221. /// <summary>
  222. /// 插入数据
  223. /// </summary>
  224. /// <param name="path">路径</param>
  225. /// <param name="node">节点</param>
  226. /// <param name="element">元素名,非空时插入新元素,否则在该元素中插入属性</param>
  227. /// <param name="attribute">属性名,非空时插入该元素属性值,否则插入元素值</param>
  228. /// <param name="value"></param>
  229. /// 使用示列:
  230. /// XMLProsess.Insert(path, "/Node", "Element", "", "Value")
  231. /// XMLProsess.Insert(path, "/Node", "Element", "Attribute", "Value")
  232. /// XMLProsess.Insert(path, "/Node", "", "Attribute", "Value")
  233. public static void Insert(string path, string node, string element, string attribute, string value)
  234. {
  235. try
  236. {
  237. XmlDocument doc = new XmlDocument();
  238. doc.Load(AppDomain.CurrentDomain.BaseDirectory.ToString() + path);
  239. XmlNode xn = doc.SelectSingleNode(node);
  240. if (element.Equals(""))
  241. {
  242. if (!attribute.Equals(""))
  243. {
  244. XmlElement xe = (XmlElement)xn;
  245. xe.SetAttribute(attribute, value);
  246. }
  247. }
  248. else
  249. {
  250. XmlElement xe = doc.CreateElement(element);
  251. if (attribute.Equals(""))
  252. xe.InnerText = value;
  253. else
  254. xe.SetAttribute(attribute, value);
  255. xn.AppendChild(xe);
  256. }
  257. doc.Save(AppDomain.CurrentDomain.BaseDirectory.ToString() + path);
  258. }
  259. catch { }
  260. }
  261. /// <summary>
  262. /// 插入数据
  263. /// </summary>
  264. /// <param name="path">路径</param>
  265. /// <param name="node">节点</param>
  266. /// <param name="element">元素名,非空时插入新元素,否则在该元素中插入属性</param>
  267. /// <param name="strList">由XML属性名和值组成的二维数组</param>
  268. public static void Insert(string path, string node, string element, string[][] strList)
  269. {
  270. try
  271. {
  272. XmlDocument doc = new XmlDocument();
  273. doc.Load(AppDomain.CurrentDomain.BaseDirectory.ToString() + path);
  274. XmlNode xn = doc.SelectSingleNode(node);
  275. XmlElement xe = doc.CreateElement(element);
  276. string strAttribute = "";
  277. string strValue = "";
  278. for (int i = 0; i < strList.Length; i++)
  279. {
  280. for (int j = 0; j < strList[i].Length; j++)
  281. {
  282. if (j == 0)
  283. strAttribute = strList[i][j];
  284. else
  285. strValue = strList[i][j];
  286. }
  287. if (strAttribute.Equals(""))
  288. xe.InnerText = strValue;
  289. else
  290. xe.SetAttribute(strAttribute, strValue);
  291. }
  292. xn.AppendChild(xe);
  293. doc.Save(AppDomain.CurrentDomain.BaseDirectory.ToString() + path);
  294. }
  295. catch { }
  296. }
  297. /// <summary>
  298. /// 插入一行数据
  299. /// </summary>
  300. /// <param name="strXmlPath">XML文件相对路径</param>
  301. /// <param name="Columns">要插入行的列名数组,如:string[] Columns = {"name","IsMarried"};</param>
  302. /// <param name="ColumnValue">要插入行每列的值数组,如:string[] ColumnValue={"XML大全","false"};</param>
  303. /// <returns>成功返回true,否则返回false</returns>
  304. public static bool WriteXmlByDataSet(string strXmlPath, string[] Columns, string[] ColumnValue)
  305. {
  306. try
  307. {
  308. //根据传入的XML路径得到.XSD的路径,两个文件放在同一个目录下
  309. string strXsdPath = strXmlPath.Substring(0, strXmlPath.IndexOf(".")) + ".xsd";
  310. DataSet ds = new DataSet();
  311. ds.ReadXmlSchema(GetXmlFullPath(strXsdPath)); //读XML架构,关系到列的数据类型
  312. ds.ReadXml(GetXmlFullPath(strXmlPath));
  313. DataTable dt = ds.Tables[0];
  314. DataRow newRow = dt.NewRow(); //在原来的表格基础上创建新行
  315. for (int i = 0; i < Columns.Length; i++) //循环给一行中的各个列赋值
  316. {
  317. newRow[Columns[i]] = ColumnValue[i];
  318. }
  319. dt.Rows.Add(newRow);
  320. dt.AcceptChanges();
  321. ds.AcceptChanges();
  322. ds.WriteXml(GetXmlFullPath(strXmlPath));
  323. return true;
  324. }
  325. catch (Exception)
  326. {
  327. return false;
  328. }
  329. }
  330. #endregion
  331. #region 修改数据
  332. /// <summary>
  333. /// 修改指定节点的数据
  334. /// </summary>
  335. /// <param name="node">节点</param>
  336. /// <param name="value"></param>
  337. public void Update(string node, string value)
  338. {
  339. try
  340. {
  341. XmlDocument doc = XMLLoad();
  342. XmlNode xn = doc.SelectSingleNode(node);
  343. xn.InnerText = value;
  344. doc.Save(AppDomain.CurrentDomain.BaseDirectory.ToString() + XMLPath);
  345. }
  346. catch { }
  347. }
  348. /// <summary>
  349. /// 修改指定节点的数据
  350. /// </summary>
  351. /// <param name="path">路径</param>
  352. /// <param name="node">节点</param>
  353. /// <param name="value"></param>
  354. /// 使用示列:
  355. /// XMLProsess.Insert(path, "/Node","Value")
  356. /// XMLProsess.Insert(path, "/Node","Value")
  357. public static void Update(string path, string node, string value)
  358. {
  359. try
  360. {
  361. XmlDocument doc = XMLLoad(path);
  362. XmlNode xn = doc.SelectSingleNode(node);
  363. xn.InnerText = value;
  364. doc.Save(AppDomain.CurrentDomain.BaseDirectory.ToString() + path);
  365. }
  366. catch { }
  367. }
  368. /// <summary>
  369. /// 修改指定节点的属性值(静态)
  370. /// </summary>
  371. /// <param name="path">路径</param>
  372. /// <param name="node">节点</param>
  373. /// <param name="attribute">属性名,非空时修改该节点属性值,否则修改节点值</param>
  374. /// <param name="value"></param>
  375. /// 使用示列:
  376. /// XMLProsess.Insert(path, "/Node", "", "Value")
  377. /// XMLProsess.Insert(path, "/Node", "Attribute", "Value")
  378. public static void Update(string path, string node, string attribute, string value)
  379. {
  380. try
  381. {
  382. XmlDocument doc = XMLLoad(path);
  383. XmlNode xn = doc.SelectSingleNode(node);
  384. XmlElement xe = (XmlElement)xn;
  385. if (attribute.Equals(""))
  386. xe.InnerText = value;
  387. else
  388. xe.SetAttribute(attribute, value);
  389. doc.Save(AppDomain.CurrentDomain.BaseDirectory.ToString() + path);
  390. }
  391. catch { }
  392. }
  393. /// <summary>
  394. /// 更改符合条件的一条记录
  395. /// </summary>
  396. /// <param name="strXmlPath">XML文件路径</param>
  397. /// <param name="Columns">列名数组</param>
  398. /// <param name="ColumnValue">列值数组</param>
  399. /// <param name="strWhereColumnName">条件列名</param>
  400. /// <param name="strWhereColumnValue">条件列值</param>
  401. public static bool UpdateXmlRow(string strXmlPath, string[] Columns, string[] ColumnValue, string strWhereColumnName, string strWhereColumnValue)
  402. {
  403. try
  404. {
  405. string strXsdPath = strXmlPath.Substring(0, strXmlPath.IndexOf(".")) + ".xsd";
  406. DataSet ds = new DataSet();
  407. ds.ReadXmlSchema(GetXmlFullPath(strXsdPath));//读XML架构,关系到列的数据类型
  408. ds.ReadXml(GetXmlFullPath(strXmlPath));
  409. //先判断行数
  410. if (ds.Tables[0].Rows.Count > 0)
  411. {
  412. for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
  413. {
  414. //如果当前记录为符合Where条件的记录
  415. if (ds.Tables[0].Rows[i][strWhereColumnName].ToString().Trim().Equals(strWhereColumnValue))
  416. {
  417. //循环给找到行的各列赋新值
  418. for (int j = 0; j < Columns.Length; j++)
  419. {
  420. ds.Tables[0].Rows[i][Columns[j]] = ColumnValue[j];
  421. }
  422. ds.AcceptChanges(); //更新DataSet
  423. ds.WriteXml(GetXmlFullPath(strXmlPath));//重新写入XML文件
  424. return true;
  425. }
  426. }
  427. }
  428. return false;
  429. }
  430. catch (Exception)
  431. {
  432. return false;
  433. }
  434. }
  435. #endregion
  436. #region 删除数据
  437. /// <summary>
  438. /// 删除节点值
  439. /// </summary>
  440. /// <param name="path">路径</param>
  441. /// <param name="node">节点</param>
  442. /// <param name="attribute">属性名,非空时删除该节点属性值,否则删除节点值</param>
  443. /// <param name="value"></param>
  444. /// 使用示列:
  445. /// XMLProsess.Delete(path, "/Node", "")
  446. /// XMLProsess.Delete(path, "/Node", "Attribute")
  447. public static void Delete(string path, string node)
  448. {
  449. try
  450. {
  451. XmlDocument doc = XMLLoad(path);
  452. XmlNode xn = doc.SelectSingleNode(node);
  453. xn.ParentNode.RemoveChild(xn);
  454. doc.Save(AppDomain.CurrentDomain.BaseDirectory.ToString() + path);
  455. }
  456. catch { }
  457. }
  458. /// <summary>
  459. /// 删除数据
  460. /// </summary>
  461. /// <param name="path">路径</param>
  462. /// <param name="node">节点</param>
  463. /// <param name="attribute">属性名,非空时删除该节点属性值,否则删除节点值</param>
  464. /// <param name="value"></param>
  465. /// 使用示列:
  466. /// XMLProsess.Delete(path, "/Node", "")
  467. /// XMLProsess.Delete(path, "/Node", "Attribute")
  468. public static void Delete(string path, string node, string attribute)
  469. {
  470. try
  471. {
  472. XmlDocument doc = XMLLoad(path);
  473. XmlNode xn = doc.SelectSingleNode(node);
  474. XmlElement xe = (XmlElement)xn;
  475. if (attribute.Equals(""))
  476. xn.ParentNode.RemoveChild(xn);
  477. else
  478. xe.RemoveAttribute(attribute);
  479. doc.Save(AppDomain.CurrentDomain.BaseDirectory.ToString() + path);
  480. }
  481. catch { }
  482. }
  483. /// <summary>
  484. /// 删除所有行
  485. /// </summary>
  486. /// <param name="strXmlPath">XML路径</param>
  487. public static bool DeleteXmlAllRows(string strXmlPath)
  488. {
  489. try
  490. {
  491. DataSet ds = new DataSet();
  492. ds.ReadXml(GetXmlFullPath(strXmlPath));
  493. if (ds.Tables[0].Rows.Count > 0)
  494. {
  495. ds.Tables[0].Rows.Clear();
  496. }
  497. ds.WriteXml(GetXmlFullPath(strXmlPath));
  498. return true;
  499. }
  500. catch (Exception)
  501. {
  502. return false;
  503. }
  504. }
  505. /// <summary>
  506. /// 通过删除DataSet中指定索引行,重写XML以实现删除指定行
  507. /// </summary>
  508. /// <param name="iDeleteRow">要删除的行在DataSet中的Index值</param>
  509. public static bool DeleteXmlRowByIndex(string strXmlPath, int iDeleteRow)
  510. {
  511. try
  512. {
  513. DataSet ds = new DataSet();
  514. ds.ReadXml(GetXmlFullPath(strXmlPath));
  515. if (ds.Tables[0].Rows.Count > 0)
  516. {
  517. ds.Tables[0].Rows[iDeleteRow].Delete();
  518. }
  519. ds.WriteXml(GetXmlFullPath(strXmlPath));
  520. return true;
  521. }
  522. catch (Exception)
  523. {
  524. return false;
  525. }
  526. }
  527. /// <summary>
  528. /// 删除指定列中指定值的行
  529. /// </summary>
  530. /// <param name="strXmlPath">XML相对路径</param>
  531. /// <param name="strColumn">列名</param>
  532. /// <param name="ColumnValue">指定值</param>
  533. public static bool DeleteXmlRows(string strXmlPath, string strColumn, string[] ColumnValue)
  534. {
  535. try
  536. {
  537. DataSet ds = new DataSet();
  538. ds.ReadXml(GetXmlFullPath(strXmlPath));
  539. if (ds.Tables[0].Rows.Count > 0)
  540. {
  541. //判断行多还是删除的值多,多的for循环放在里面
  542. if (ColumnValue.Length > ds.Tables[0].Rows.Count)
  543. {
  544. for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
  545. {
  546. for (int j = 0; j < ColumnValue.Length; j++)
  547. {
  548. if (ds.Tables[0].Rows[i][strColumn].ToString().Trim().Equals(ColumnValue[j]))
  549. {
  550. ds.Tables[0].Rows[i].Delete();
  551. }
  552. }
  553. }
  554. }
  555. else
  556. {
  557. for (int j = 0; j < ColumnValue.Length; j++)
  558. {
  559. for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
  560. {
  561. if (ds.Tables[0].Rows[i][strColumn].ToString().Trim().Equals(ColumnValue[j]))
  562. {
  563. ds.Tables[0].Rows[i].Delete();
  564. }
  565. }
  566. }
  567. }
  568. ds.WriteXml(GetXmlFullPath(strXmlPath));
  569. }
  570. return true;
  571. }
  572. catch (Exception)
  573. {
  574. return false;
  575. }
  576. }
  577. #endregion
  578. }
  579. }