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#中xml操作类的代码详解的详细内容。
   
 
   