C#实现的xml操作类完整实例
程序员文章站
2023-11-08 15:31:40
本文实例讲述了c#实现的xml操作类,分享给大家供大家参考,具体如下:
using system;
using system.data;
using syst...
本文实例讲述了c#实现的xml操作类,分享给大家供大家参考,具体如下:
using system; using system.data; using system.configuration; using system.web; using system.web.security; using system.web.ui; using system.web.ui.webcontrols; using system.web.ui.webcontrols.webparts; using system.web.ui.htmlcontrols; using system.io; using system.xml; using system.text; namespace mscl { /// <summary> /// xml 操作基类 /// </summary> public class xmlhelper : idisposable { //以下为单一功能的静态类 #region 读取xml到dataset /**//************************************************** * 函数名称:getxml(string xmlpath) * 功能说明:读取xml到dataset * 参 数:xmlpath:xml文档路径 * 使用示列: * using ec; //引用命名空间 * string xmlpath = server.mappath("/ebdnsconfig/dnsconfig.xml"); //获取xml路径 * dataset ds = ec.xmlobject.getxml(xmlpath); //读取xml到dataset中 ************************************************/ /**//// <summary> /// 功能:读取xml到dataset中 /// </summary> /// <param name="xmlpath">xml路径</param> /// <returns>dataset</returns> public static dataset getxml(string xmlpath) { dataset ds = new dataset(); ds.readxml(@xmlpath); return ds; } #endregion #region 读取xml文档并返回一个节点 /**//************************************************** * 函数名称:readxmlreturnnode(string xmlpath,string node) * 功能说明:读取xml文档并返回一个节点:适用于一级节点 * 参 数: xmlpath:xml文档路径;node 返回的节点名称 * 适应用xml:<?xml version="1.0" encoding="utf-8" ?> * <root> * <dns1>ns1.everdns.com</dns1> * </root> * 使用示列: * using ec; //引用命名空间 * string xmlpath = server.mappath("/ebdnsconfig/dnsconfig.xml"); //获取xml路径 * response.write(xmlobject.readxmlreturnnode(xmlpath, "mailmanager")); ************************************************/ /**//// <summary> /// 读取xml文档并返回一个节点:适用于一级节点 /// </summary> /// <param name="xmlpath">xml路径</param> /// <param name="nodename">节点</param> /// <returns></returns> public static string readxmlreturnnode(string xmlpath, string node) { xmldocument docxml = new xmldocument(); docxml.load(@xmlpath); xmlnodelist xn = docxml.getelementsbytagname(node); return xn.item(0).innertext.tostring(); } #endregion #region 查找数据,返回一个dataset /**//************************************************** * 函数名称:getxmldata(string xmlpath, string xmlpathnode) * 功能说明:查找数据,返回当前节点的所有下级节点,填充到一个dataset中 * 参 数:xmlpath:xml文档路径;xmlpathnode:当前节点的路径 * 使用示列: * using ec; //引用命名空间 * string xmlpath = server.mappath("/ebdomainconfig/domainconfig.xml"); //获取xml路径 * dataset ds = new dataset(); * ds = xmlobject.getxmldata(xmlpath, "root/items");//读取当前路径 * this.gridview1.datasource = ds; * this.gridview1.databind(); * ds.clear(); * ds.dispose(); * xml示例: * <?xml version="1.0" encoding="utf-8" ?> * <root> * <items name="xinnet"> * <url>http://www.paycenter.com.cn/cgi-bin/</url> * <port>80</port> * </items> * </root> ************************************************/ /**//// <summary> /// 查找数据,返回当前节点的所有下级节点,填充到一个dataset中 /// </summary> /// <param name="xmlpath">xml文档路径</param> /// <param name="xmlpathnode">节点的路径:根节点/父节点/当前节点</param> /// <returns></returns> public static dataset getxmldata(string xmlpath, string xmlpathnode) { xmldocument objxmldoc = new xmldocument(); objxmldoc.load(xmlpath); dataset ds = new dataset(); stringreader read = new stringreader(objxmldoc.selectsinglenode(xmlpathnode).outerxml); ds.readxml(read); return ds; } #endregion #region 更新xml节点内容 /**//************************************************** * 函数名称:xmlnodereplace(string xmlpath,string node,string content) * 功能说明:更新xml节点内容 * 参 数:xmlpath:xml文档路径;node:当前节点的路径;content:内容 * 使用示列: * using ec; //引用命名空间 * string xmlpath = server.mappath("/ebdomainconfig/domainconfig.xml"); //获取xml路径 * xmlobject.xmlnodereplace(xmlpath, "root/test", "56789"); //更新节点内容 ************************************************/ /**//// <summary> /// 更新xml节点内容 /// </summary> /// <param name="xmlpath">xml路径</param> /// <param name="node">要更换内容的节点:节点路径 根节点/父节点/当前节点</param> /// <param name="content">新的内容</param> public static void xmlnodereplace(string xmlpath, string node, string content) { xmldocument objxmldoc = new xmldocument(); objxmldoc.load(xmlpath); objxmldoc.selectsinglenode(node).innertext = content; objxmldoc.save(xmlpath); } #endregion #region 删除xml节点和此节点下的子节点 /**//************************************************** * 函数名称:xmlnodedelete(string xmlpath,string node) * 功能说明:删除xml节点和此节点下的子节点 * 参 数:xmlpath:xml文档路径;node:当前节点的路径; * 使用示列: * using ec; //引用命名空间 * string xmlpath = server.mappath("/ebdomainconfig/domainconfig.xml"); //获取xml路径 * xmlobject.xmlnodedelete(xmlpath, "root/test"); //删除当前节点 ************************************************/ /**//// <summary> /// 删除xml节点和此节点下的子节点 /// </summary> /// <param name="xmlpath">xml文档路径</param> /// <param name="node">节点路径</param> public static void xmlnodedelete(string xmlpath, string node) { xmldocument objxmldoc = new xmldocument(); objxmldoc.load(xmlpath); string mainnode = node.substring(0, node.lastindexof("/")); objxmldoc.selectsinglenode(mainnode).removechild(objxmldoc.selectsinglenode(node)); objxmldoc.save(xmlpath); } #endregion #region 插入一个节点和此节点的子节点 /**//************************************************** * 函数名称:xmlinsertnode(string xmlpath, string mailnode, string childnode, string element,string content) * 功能说明:插入一个节点和此节点的字节点 * 参 数:xmlpath:xml文档路径;mailnode:当前节点的路径;childnode:新插入的节点;element:插入节点的子节点;content:子节点的内容 * 使用示列: * using ec; //引用命名空间 * string xmlpath = server.mappath("/ebdomainconfig/domainconfig.xml"); //获取xml路径 * xmlobject.xmlinsertnode(xmlpath, "root/test","test1","test2","测试内容"); //插入一个节点和此节点的字节点 * 生成的xml格式为 * <test> * <test1> * <test2>测试内容</test2> * </test1> * </test> ************************************************/ /**//// <summary> /// 插入一个节点和此节点的子节点 /// </summary> /// <param name="xmlpath">xml路径</param> /// <param name="mailnode">当前节点路径</param> /// <param name="childnode">新插入节点</param> /// <param name="element">插入节点的子节点</param> /// <param name="content">子节点的内容,已经应用cdata</param> public static void xmlinsertnode(string xmlpath, string mailnode, string childnode, string element, string content) { xmldocument objxmldoc = new xmldocument(); objxmldoc.load(xmlpath); xmlnode objrootnode = objxmldoc.selectsinglenode(mailnode); xmlelement objchildnode = objxmldoc.createelement(childnode); objrootnode.appendchild(objchildnode); xmlelement objelement = objxmldoc.createelement(element); xmlcdatasection xcds = objxmldoc.createcdatasection(content); objelement.appendchild(xcds); objchildnode.appendchild(objelement); objxmldoc.save(xmlpath); } #endregion #region 插入一节点,带一属性 /**//************************************************** * 函数名称:xmlinsertelement(string xmlpath, string mainnode, string element, string attrib, string attribcontent, string content) * 功能说明:插入一节点,带一属性 * 参 数:xmlpath:xml文档路径;mailnode:当前节点的路径;element:新插入的节点;attrib:属性名称;attribcontent:属性值;content:节点的内容 * 使用示列: * using ec; //引用命名空间 * string xmlpath = server.mappath("/ebdomainconfig/domainconfig.xml"); //获取xml路径 * xmlobject.xmlinsertelement(xmlpath, "root/test", "test1", "attrib", "属性值", "节点内容"); //插入一节点,带一属性 * 生成的xml格式为 * <test> * <test1 attrib="属性值">节点内容</test1> * </test> ************************************************/ /**//// <summary> /// 插入一节点,带一属性 /// </summary> /// <param name="xmlpath">xml文档路径</param> /// <param name="mainnode">当前节点路径</param> /// <param name="element">新节点</param> /// <param name="attrib">属性名称</param> /// <param name="attribcontent">属性值</param> /// <param name="content">新节点值</param> public static void xmlinsertelement(string xmlpath, string mainnode, string element, string attrib, string attribcontent, string content) { xmldocument objxmldoc = new xmldocument(); objxmldoc.load(xmlpath); xmlnode objnode = objxmldoc.selectsinglenode(mainnode); xmlelement objelement = objxmldoc.createelement(element); objelement.setattribute(attrib, attribcontent); objelement.innertext = content; objnode.appendchild(objelement); objxmldoc.save(xmlpath); } #endregion #region 插入一节点不带属性 /**//************************************************** * 函数名称:xmlinsertelement(string xmlpath, string mainnode, string element, string content) * 功能说明:插入一节点不带属性 * 参 数:xmlpath:xml文档路径;mailnode:当前节点的路径;element:新插入的节点;content:节点的内容 * 使用示列: * using ec; //引用命名空间 * string xmlpath = server.mappath("/ebdomainconfig/domainconfig.xml"); //获取xml路径 * xmlobject.xmlinsertelement(xmlpath, "root/test", "text1", "节点内容"); //插入一节点不带属性 * 生成的xml格式为 * <test> * <text1>节点内容</text1> * </test> ************************************************/ public static void xmlinsertelement(string xmlpath, string mainnode, string element, string content) { xmldocument objxmldoc = new xmldocument(); objxmldoc.load(xmlpath); xmlnode objnode = objxmldoc.selectsinglenode(mainnode); xmlelement objelement = objxmldoc.createelement(element); objelement.innertext = content; objnode.appendchild(objelement); objxmldoc.save(xmlpath); } #endregion //必须创建对象才能使用的类 private bool _alreadydispose = false; private xmldocument xmldoc = new xmldocument(); private xmlnode xmlnode; private xmlelement xmlelem; #region 构造与释构 public xmlhelper() { } ~xmlhelper() { dispose(); } protected virtual void dispose(bool isdisposing) { if (_alreadydispose) return; if (isdisposing) { // } _alreadydispose = true; } #endregion #region idisposable 成员 public void dispose() { dispose(true); gc.suppressfinalize(this); } #endregion #region 创建xml文档 /**//************************************************** * 对象名称:xmlobject * 功能说明:创建xml文档 * 使用示列: * using ec; //引用命名空间 * string xmlpath = server.mappath("test.xml"); * xmlobject obj = new xmlobject(); * 创建根节点 * obj.createxmlroot("root"); * // 创建空节点 * //obj.creatxmlnode("root", "node"); * //创建一个带值的节点 * //obj.creatxmlnode("root", "node", "带值的节点"); * //创建一个仅带属性的节点 * //obj.creatxmlnode("root", "node", "attribe", "属性值"); * //创建一个仅带两个属性值的节点 * //obj.creatxmlnode("root", "node", "attribe", "属性值", "attribe2", "属性值2"); * //创建一个带属性值的节点值的节点 * // obj.creatxmlnode("root", "node", "attribe", "属性值","节点值"); * //在当前节点插入带两个属性值的节点 * obj.creatxmlnode("root", "node", "attribe", "属性值", "attribe2", "属性值2","节点值"); * obj.xmlsave(xmlpath); * obj.dispose(); ************************************************/ #region 创建一个只有声明和根节点的xml文档 /**//// <summary> /// 创建一个只有声明和根节点的xml文档 /// </summary> /// <param name="root"></param> public void createxmlroot(string root) { //加入xml的声明段落 xmlnode = xmldoc.createnode(xmlnodetype.xmldeclaration, "", ""); xmldoc.appendchild(xmlnode); //加入一个根元素 xmlelem = xmldoc.createelement("", root, ""); xmldoc.appendchild(xmlelem); } #endregion #region 在当前节点下插入一个空节点节点 /**//// <summary> /// 在当前节点下插入一个空节点节点 /// </summary> /// <param name="mainnode">当前节点路径</param> /// <param name="node">节点名称</param> public void creatxmlnode(string mainnode, string node) { xmlnode mainnode = xmldoc.selectsinglenode(mainnode); xmlelement objelem = xmldoc.createelement(node); mainnode.appendchild(objelem); } #endregion #region 在当前节点插入一个仅带值的节点 /**//// <summary> /// 在当前节点插入一个仅带值的节点 /// </summary> /// <param name="mainnode">当前节点</param> /// <param name="node">新节点</param> /// <param name="content">新节点值</param> public void creatxmlnode(string mainnode, string node, string content) { xmlnode mainnode = xmldoc.selectsinglenode(mainnode); xmlelement objelem = xmldoc.createelement(node); objelem.innertext = content; mainnode.appendchild(objelem); } #endregion #region 在当前节点的插入一个仅带属性值的节点 /**//// <summary> /// 在当前节点的插入一个仅带属性值的节点 /// </summary> /// <param name="mainnode">当前节点或路径</param> /// <param name="node">新节点</param> /// <param name="attrib">新节点属性名称</param> /// <param name="attribvalue">新节点属性值</param> public void creatxmlnode(string mainnode, string node, string attrib, string attribvalue) { xmlnode mainnode = xmldoc.selectsinglenode(mainnode); xmlelement objelem = xmldoc.createelement(node); objelem.setattribute(attrib, attribvalue); mainnode.appendchild(objelem); } #endregion #region 创建一个带属性值的节点值的节点 /**//// <summary> /// 创建一个带属性值的节点值的节点 /// </summary> /// <param name="mainnode">当前节点或路径</param> /// <param name="node">节点名称</param> /// <param name="attrib">属性名称</param> /// <param name="attribvalue">属性值</param> /// <param name="content">节点传情</param> public void creatxmlnode(string mainnode, string node, string attrib, string attribvalue, string content) { xmlnode mainnode = xmldoc.selectsinglenode(mainnode); xmlelement objelem = xmldoc.createelement(node); objelem.setattribute(attrib, attribvalue); objelem.innertext = content; mainnode.appendchild(objelem); } #endregion #region 在当前节点的插入一个仅带2个属性值的节点 /**//// <summary> /// 在当前节点的插入一个仅带2个属性值的节点 /// </summary> /// <param name="mainnode">当前节点或路径</param> /// <param name="node">节点名称</param> /// <param name="attrib">属性名称一</param> /// <param name="attribvalue">属性值一</param> /// <param name="attrib2">属性名称二</param> /// <param name="attribvalue2">属性值二</param> public void creatxmlnode(string mainnode, string node, string attrib, string attribvalue, string attrib2, string attribvalue2) { xmlnode mainnode = xmldoc.selectsinglenode(mainnode); xmlelement objelem = xmldoc.createelement(node); objelem.setattribute(attrib, attribvalue); objelem.setattribute(attrib2, attribvalue2); mainnode.appendchild(objelem); } #endregion #region 在当前节点插入带两个属性的节点 /**//// <summary> /// 在当前节点插入带两个属性的节点 /// </summary> /// <param name="mainnode">当前节点或路径</param> /// <param name="node">节点名称</param> /// <param name="attrib">属性名称一</param> /// <param name="attribvalue">属性值一</param> /// <param name="attrib2">属性名称二</param> /// <param name="attribvalue2">属性值二</param> /// <param name="content">节点值</param> public void creatxmlnode(string mainnode, string node, string attrib, string attribvalue, string attrib2, string attribvalue2, string content) { xmlnode mainnode = xmldoc.selectsinglenode(mainnode); xmlelement objelem = xmldoc.createelement(node); objelem.setattribute(attrib, attribvalue); objelem.setattribute(attrib2, attribvalue2); objelem.innertext = content; mainnode.appendchild(objelem); } #endregion #region 保存xml /**//// <summary> /// 保存xml /// </summary> /// <param name="path">保存的当前路径</param> public void xmlsave(string path) { xmldoc.save(path); } #endregion #endregion #region 根据父节点属性值读取子节点值 /**//************************************************** * 函数名称:getsubelementbyattribute(string xmlpath, string fatherelenetname, string attributename, int attributeindex, int arraylength) * 功能说明:根据父节点属性值读取子节点值 * 参 数: xmlpath:xml路径;fatherelenetname:父节点名;attributename:属性值;attributeindex:属性索引;arraylength:要返回的节点数组长度 * 适应用xml: * arraylist al = new arraylist(); * al = ec.xmlobject.getsubelementbyattribute(xmlpath, "page", "/index.aspx", 0, 3); * for (int i = 0; i < al.count; i++) * { * response.write(al[i].tostring()); * response.write("<br>"); * } ************************************************/ /**//// <summary> /// 根据父节点属性读取字节点值 /// </summary> /// <param name="xmlpath">xml路径</param> /// <param name="fatherelenetname">父节点名</param> /// <param name="attributename">属性值</param> /// <param name="attributeindex">属性索引</param> /// <param name="arraylength">要返回的节点数组长度</param> /// <returns></returns> public static system.collections.arraylist getsubelementbyattribute(string xmlpath, string fatherelenetname, string attributename, int attributeindex, int arraylength) { system.collections.arraylist al = new system.collections.arraylist(); xmldocument docxml = new xmldocument(); docxml.load(@xmlpath); xmlnodelist xn = docxml.documentelement.childnodes; //遍历第一层节点 foreach (xmlelement element in xn) { //判断父节点是否为指定节点 if (element.name == fatherelenetname) { //判断父节点属性的索引是否大于指定索引 if (element.attributes.count < attributeindex) return null; //判断父节点的属性值是否等于指定属性 if (element.attributes[attributeindex].value == attributename) { xmlnodelist xx = element.childnodes; if (xx.count > 0) { for (int i = 0; i < arraylength & i < xx.count; i++) { al.add(xx[i].innertext); } } } } } return al; } #endregion #region 根据节点属性读取子节点值(较省资源模式) /**//************************************************** * 函数名称:getsubelementbyattribute(string xmlpath, string fatherelement, string attributename, string attributevalue, int arraylength) * 功能说明:根据父节点属性值读取子节点值 * 参 数: xmlpath:xml路径;fatherelenetname:父节点名;attributename:属性名;attributevalue:属性值;arraylength:要返回的节点数组长度 * 适应用xml: * arraylist al = new arraylist(); * al = ec.xmlobject.getsubelementbyattribute(xmlpath, "page", "@name", "/index.aspx", 3); * for (int i = 0; i < al.count; i++) * { * response.write(al[i].tostring()); * response.write("<br>"); * } ************************************************/ /**//// <summary> /// 根据节点属性读取子节点值(较省资源模式) /// </summary> /// <param name="xmlpath">xml路径</param> /// <param name="fatherelement">父节点值</param> /// <param name="attributename">属性名称</param> /// <param name="attributevalue">属性值</param> /// <param name="arraylength">返回的数组长度</param> /// <returns></returns> public static system.collections.arraylist getsubelementbyattribute(string xmlpath, string fatherelement, string attributename, string attributevalue, int arraylength) { system.collections.arraylist al = new system.collections.arraylist(); xmldocument docxml = new xmldocument(); docxml.load(@xmlpath); xmlnodelist xn; xn = docxml.documentelement.selectnodes("//" + fatherelement + "[" + @attributename + "='" + attributevalue + "']"); xmlnodelist xx = xn.item(0).childnodes; for (int i = 0; i < arraylength & i < xx.count; i++) { al.add(xx.item(i).innertext); } return al; } #endregion } }
更多关于c#相关内容感兴趣的读者可查看本站专题:《c#程序设计之线程使用技巧总结》、《c#操作excel技巧总结》、《c#中xml文件操作技巧汇总》、《c#常见控件用法教程》、《winform控件用法总结》、《c#数据结构与算法教程》、《c#数组操作技巧总结》及《c#面向对象程序设计入门教程》
希望本文所述对大家c#程序设计有所帮助。