C#自定义处理xml数据类实例
2021-07-19 06:42
阅读:579
本文实例讲述了C#自定义处理xml数据类。分享给大家供大家参考。具体分析如下:
这个C#类专门用户处理xml数据,可以大大简化xml的操作,类中封装了常用的xml操作,包括打开、读取xml数据,读取、写入节点数据,通过xpath读取节点数据,导出节点数据等等,还可以根据需要自己扩充类的功能。
using System; using System.Data; using System.IO; using System.Xml; namespace DotNet.Utilities { public class XMLProcess { #region 构造函数 public XMLProcess() { } public XMLProcess(string strPath) { this._XMLPath = strPath; } #endregion #region 公有属性 private string _XMLPath; public string XMLPath { get { return this._XMLPath; } } #endregion #region 私有方法 ////// 导入XML文件 /// /// XML文件路径 private XmlDocument XMLLoad() { string XMLFile = XMLPath; XmlDocument xmldoc = new XmlDocument(); try { string filename = AppDomain.CurrentDomain.BaseDirectory.ToString() + XMLFile; if (File.Exists(filename)) xmldoc.Load(filename); } catch (Exception e) { } return xmldoc; } ////// 导入XML文件 /// /// XML文件路径 private static XmlDocument XMLLoad(string strPath) { XmlDocument xmldoc = new XmlDocument(); try { string filename = AppDomain.CurrentDomain.BaseDirectory.ToString() + strPath; if (File.Exists(filename)) xmldoc.Load(filename); } catch (Exception e) { } return xmldoc; } ////// 返回完整路径 /// /// Xml的路径 private static string GetXmlFullPath(string strPath) { if (strPath.IndexOf(":") > 0) { return strPath; } else { return System.Web.HttpContext.Current.Server.MapPath(strPath); } } #endregion #region 读取数据 ////// 读取指定节点的数据 /// /// 节点 /// 使用示列: /// XMLProsess.Read("/Node", "") /// XMLProsess.Read("/Node/Element[@Attribute=‘Name‘]") public string Read(string node) { string value = ""; try { XmlDocument doc = XMLLoad(); XmlNode xn = doc.SelectSingleNode(node); value = xn.InnerText; } catch { } return value; } ////// 读取指定路径和节点的串联值 /// /// 路径 /// 节点 /// 属性名,非空时返回该属性值,否则返回串联值 /// 使用示列: /// XMLProsess.Read(path, "/Node", "") /// XMLProsess.Read(path, "/Node/Element[@Attribute=‘Name‘]") public static string Read(string path, string node) { string value = ""; try { XmlDocument doc = XMLLoad(path); XmlNode xn = doc.SelectSingleNode(node); value = xn.InnerText; } catch { } return value; } ////// 读取指定路径和节点的属性值 /// /// 路径 /// 节点 /// 属性名,非空时返回该属性值,否则返回串联值 /// 使用示列: /// XMLProsess.Read(path, "/Node", "") /// XMLProsess.Read(path, "/Node/Element[@Attribute=‘Name‘]", "Attribute") public static string Read(string path, string node, string attribute) { string value = ""; try { XmlDocument doc = XMLLoad(path); XmlNode xn = doc.SelectSingleNode(node); value = (attribute.Equals("") ? xn.InnerText : xn.Attributes[attribute].Value); } catch { } return value; } ////// 获取某一节点的所有孩子节点的值 /// /// 要查询的节点 public string[] ReadAllChildallValue(string node) { int i = 0; string[] str = { }; XmlDocument doc = XMLLoad(); XmlNode xn = doc.SelectSingleNode(node); XmlNodeList nodelist = xn.ChildNodes; //得到该节点的子节点 if (nodelist.Count > 0) { str = new string[nodelist.Count]; foreach (XmlElement el in nodelist)//读元素值 { str[i] = el.Value; i++; } } return str; } ////// 获取某一节点的所有孩子节点的值 /// /// 要查询的节点 public XmlNodeList ReadAllChild(string node) { XmlDocument doc = XMLLoad(); XmlNode xn = doc.SelectSingleNode(node); XmlNodeList nodelist = xn.ChildNodes; //得到该节点的子节点 return nodelist; } ////// 读取XML返回经排序或筛选后的DataView /// /// 筛选条件,如:"name=‘kgdiwss‘" /// 排序条件,如:"Id desc" public DataView GetDataViewByXml(string strWhere, string strSort) { try { string XMLFile = this.XMLPath; string filename = AppDomain.CurrentDomain.BaseDirectory.ToString() + XMLFile; DataSet ds = new DataSet(); ds.ReadXml(filename); DataView dv = new DataView(ds.Tables[0]); //创建DataView来完成排序或筛选操作 if (strSort != null) { dv.Sort = strSort; //对DataView中的记录进行排序 } if (strWhere != null) { dv.RowFilter = strWhere; //对DataView中的记录进行筛选,找到我们想要的记录 } return dv; } catch (Exception) { return null; } } ////// 读取XML返回DataSet /// /// XML文件相对路径 public DataSet GetDataSetByXml(string strXmlPath) { try { DataSet ds = new DataSet(); ds.ReadXml(GetXmlFullPath(strXmlPath)); if (ds.Tables.Count > 0) { return ds; } return null; } catch (Exception) { return null; } } #endregion #region 插入数据 ////// 插入数据 /// /// 路径 /// 节点 /// 元素名,非空时插入新元素,否则在该元素中插入属性 /// 属性名,非空时插入该元素属性值,否则插入元素值 /// 值 /// 使用示列: /// XMLProsess.Insert(path, "/Node", "Element", "", "Value") /// XMLProsess.Insert(path, "/Node", "Element", "Attribute", "Value") /// XMLProsess.Insert(path, "/Node", "", "Attribute", "Value") public static void Insert(string path, string node, string element, string attribute, string value) { try { XmlDocument doc = new XmlDocument(); doc.Load(AppDomain.CurrentDomain.BaseDirectory.ToString() + path); XmlNode xn = doc.SelectSingleNode(node); if (element.Equals("")) { if (!attribute.Equals("")) { XmlElement xe = (XmlElement)xn; xe.SetAttribute(attribute, value); } } else { XmlElement xe = doc.CreateElement(element); if (attribute.Equals("")) xe.InnerText = value; else xe.SetAttribute(attribute, value); xn.AppendChild(xe); } doc.Save(AppDomain.CurrentDomain.BaseDirectory.ToString() + path); } catch { } } ////// 插入数据 /// /// 路径 /// 节点 /// 元素名,非空时插入新元素,否则在该元素中插入属性 /// 由XML属性名和值组成的二维数组 public static void Insert(string path, string node, string element, string[][] strList) { try { XmlDocument doc = new XmlDocument(); doc.Load(AppDomain.CurrentDomain.BaseDirectory.ToString() + path); XmlNode xn = doc.SelectSingleNode(node); XmlElement xe = doc.CreateElement(element); string strAttribute = ""; string strValue = ""; for (int i = 0; i /// 插入一行数据 /// /// XML文件相对路径 /// 要插入行的列名数组,如:string[] Columns = {"name","IsMarried"}; /// 要插入行每列的值数组,如:string[] ColumnValue={"XML大全","false"}; ///成功返回true,否则返回false public static bool WriteXmlByDataSet(string strXmlPath, string[] Columns, string[] ColumnValue) { try { //根据传入的XML路径得到.XSD的路径,两个文件放在同一个目录下 string strXsdPath = strXmlPath.Substring(0, strXmlPath.IndexOf(".")) + ".xsd"; DataSet ds = new DataSet(); ds.ReadXmlSchema(GetXmlFullPath(strXsdPath)); //读XML架构,关系到列的数据类型 ds.ReadXml(GetXmlFullPath(strXmlPath)); DataTable dt = ds.Tables[0]; DataRow newRow = dt.NewRow(); //在原来的表格基础上创建新行 for (int i = 0; i /// 修改指定节点的数据 /// /// 节点 /// 值 public void Update(string node, string value) { try { XmlDocument doc = XMLLoad(); XmlNode xn = doc.SelectSingleNode(node); xn.InnerText = value; doc.Save(AppDomain.CurrentDomain.BaseDirectory.ToString() + XMLPath); } catch { } } ////// 修改指定节点的数据 /// /// 路径 /// 节点 /// 值 /// 使用示列: /// XMLProsess.Insert(path, "/Node","Value") /// XMLProsess.Insert(path, "/Node","Value") public static void Update(string path, string node, string value) { try { XmlDocument doc = XMLLoad(path); XmlNode xn = doc.SelectSingleNode(node); xn.InnerText = value; doc.Save(AppDomain.CurrentDomain.BaseDirectory.ToString() + path); } catch { } } ////// 修改指定节点的属性值(静态) /// /// 路径 /// 节点 /// 属性名,非空时修改该节点属性值,否则修改节点值 /// 值 /// 使用示列: /// XMLProsess.Insert(path, "/Node", "", "Value") /// XMLProsess.Insert(path, "/Node", "Attribute", "Value") public static void Update(string path, string node, string attribute, string value) { try { XmlDocument doc = XMLLoad(path); XmlNode xn = doc.SelectSingleNode(node); XmlElement xe = (XmlElement)xn; if (attribute.Equals("")) xe.InnerText = value; else xe.SetAttribute(attribute, value); doc.Save(AppDomain.CurrentDomain.BaseDirectory.ToString() + path); } catch { } } ////// 更改符合条件的一条记录 /// /// XML文件路径 /// 列名数组 /// 列值数组 /// 条件列名 /// 条件列值 public static bool UpdateXmlRow(string strXmlPath, string[] Columns, string[] ColumnValue, string strWhereColumnName, string strWhereColumnValue) { try { string strXsdPath = strXmlPath.Substring(0, strXmlPath.IndexOf(".")) + ".xsd"; DataSet ds = new DataSet(); ds.ReadXmlSchema(GetXmlFullPath(strXsdPath));//读XML架构,关系到列的数据类型 ds.ReadXml(GetXmlFullPath(strXmlPath)); //先判断行数 if (ds.Tables[0].Rows.Count > 0) { for (int i = 0; i /// 删除节点值 /// /// 路径 /// 节点 /// 属性名,非空时删除该节点属性值,否则删除节点值 /// 值 /// 使用示列: /// XMLProsess.Delete(path, "/Node", "") /// XMLProsess.Delete(path, "/Node", "Attribute") public static void Delete(string path, string node) { try { XmlDocument doc = XMLLoad(path); XmlNode xn = doc.SelectSingleNode(node); xn.ParentNode.RemoveChild(xn); doc.Save(AppDomain.CurrentDomain.BaseDirectory.ToString() + path); } catch { } } ////// 删除数据 /// /// 路径 /// 节点 /// 属性名,非空时删除该节点属性值,否则删除节点值 /// 值 /// 使用示列: /// XMLProsess.Delete(path, "/Node", "") /// XMLProsess.Delete(path, "/Node", "Attribute") public static void Delete(string path, string node, string attribute) { try { XmlDocument doc = XMLLoad(path); XmlNode xn = doc.SelectSingleNode(node); XmlElement xe = (XmlElement)xn; if (attribute.Equals("")) xn.ParentNode.RemoveChild(xn); else xe.RemoveAttribute(attribute); doc.Save(AppDomain.CurrentDomain.BaseDirectory.ToString() + path); } catch { } } ////// 删除所有行 /// /// XML路径 public static bool DeleteXmlAllRows(string strXmlPath) { try { DataSet ds = new DataSet(); ds.ReadXml(GetXmlFullPath(strXmlPath)); if (ds.Tables[0].Rows.Count > 0) { ds.Tables[0].Rows.Clear(); } ds.WriteXml(GetXmlFullPath(strXmlPath)); return true; } catch (Exception) { return false; } } ////// 通过删除DataSet中指定索引行,重写XML以实现删除指定行 /// /// 要删除的行在DataSet中的Index值 public static bool DeleteXmlRowByIndex(string strXmlPath, int iDeleteRow) { try { DataSet ds = new DataSet(); ds.ReadXml(GetXmlFullPath(strXmlPath)); if (ds.Tables[0].Rows.Count > 0) { ds.Tables[0].Rows[iDeleteRow].Delete(); } ds.WriteXml(GetXmlFullPath(strXmlPath)); return true; } catch (Exception) { return false; } } ////// 删除指定列中指定值的行 /// /// XML相对路径 /// 列名 /// 指定值 public static bool DeleteXmlRows(string strXmlPath, string strColumn, string[] ColumnValue) { try { DataSet ds = new DataSet(); ds.ReadXml(GetXmlFullPath(strXmlPath)); if (ds.Tables[0].Rows.Count > 0) { //判断行多还是删除的值多,多的for循环放在里面 if (ColumnValue.Length > ds.Tables[0].Rows.Count) { for (int i = 0; i
希望本文所述对大家的C#程序设计有所帮助。
除声明外,跑步客文章均为原创,转载请以链接形式标明本文地址
C#自定义处理xml数据类实例
C#自定义处理xml数据类实例
本文地址: http://www.paobuke.com/develop/c-develop/pbk23070.html
相关内容
C# 文件上传下载(Excel导入,多线程下载)功能的实现代码
Mongodb在CSharp里实现Aggregate实例
winform c#中子窗体关闭刷新父窗体的实例
protobuf对象二进制序列化存储(详解)
C#6.0中10大新特性的应用和总结
C#播放铃声最简单实现方法
C#将jpg转换为pdf的方法
DevExpress获取节点下可视区域子节点集合的实现方法
下一篇:8.Python编写登录接口
评论
亲,登录后才可以留言!