C#实现的xml操作类完整实例
本文实例讲述了C#实现的xml操作类,分享给大家供大家参考,具体如下:
usingSystem; usingSystem.Data; usingSystem.Configuration; usingSystem.Web; usingSystem.Web.Security; usingSystem.Web.UI; usingSystem.Web.UI.WebControls; usingSystem.Web.UI.WebControls.WebParts; usingSystem.Web.UI.HtmlControls; usingSystem.IO; usingSystem.Xml; usingSystem.Text; namespaceMSCL { ///<summary> ///XML操作基类 ///</summary> publicclassXmlHelper:IDisposable { //以下为单一功能的静态类 #region读取XML到DataSet /**//************************************************** *函数名称:GetXml(stringXmlPath) *功能说明:读取XML到DataSet *参数:XmlPath:xml文档路径 *使用示列: *usingEC;//引用命名空间 *stringxmlPath=Server.MapPath("/EBDnsConfig/DnsConfig.xml");//获取xml路径 *DataSetds=EC.XmlObject.GetXml(xmlPath);//读取xml到DataSet中 ************************************************/ /**////<summary> ///功能:读取XML到DataSet中 ///</summary> ///<paramname="XmlPath">xml路径</param> ///<returns>DataSet</returns> publicstaticDataSetGetXml(stringXmlPath) { DataSetds=newDataSet(); ds.ReadXml(@XmlPath); returnds; } #endregion #region读取xml文档并返回一个节点 /**//************************************************** *函数名称:ReadXmlReturnNode(stringXmlPath,stringNode) *功能说明:读取xml文档并返回一个节点:适用于一级节点 *参数:XmlPath:xml文档路径;Node返回的节点名称 *适应用Xml:<?xmlversion="1.0"encoding="utf-8"?> *<root> *<dns1>ns1.everdns.com</dns1> *</root> *使用示列: *usingEC;//引用命名空间 *stringxmlPath=Server.MapPath("/EBDnsConfig/DnsConfig.xml");//获取xml路径 *Response.Write(XmlObject.ReadXmlReturnNode(xmlPath,"mailmanager")); ************************************************/ /**////<summary> ///读取xml文档并返回一个节点:适用于一级节点 ///</summary> ///<paramname="XmlPath">xml路径</param> ///<paramname="NodeName">节点</param> ///<returns></returns> publicstaticstringReadXmlReturnNode(stringXmlPath,stringNode) { XmlDocumentdocXml=newXmlDocument(); docXml.Load(@XmlPath); XmlNodeListxn=docXml.GetElementsByTagName(Node); returnxn.Item(0).InnerText.ToString(); } #endregion #region查找数据,返回一个DataSet /**//************************************************** *函数名称:GetXmlData(stringxmlPath,stringXmlPathNode) *功能说明:查找数据,返回当前节点的所有下级节点,填充到一个DataSet中 *参数:xmlPath:xml文档路径;XmlPathNode:当前节点的路径 *使用示列: *usingEC;//引用命名空间 *stringxmlPath=Server.MapPath("/EBDomainConfig/DomainConfig.xml");//获取xml路径 *DataSetds=newDataSet(); *ds=XmlObject.GetXmlData(xmlPath,"root/items");//读取当前路径 *this.GridView1.DataSource=ds; *this.GridView1.DataBind(); *ds.Clear(); *ds.Dispose(); *Xml示例: *<?xmlversion="1.0"encoding="utf-8"?> *<root> *<itemsname="xinnet"> *<url>http://www.paycenter.com.cn/cgi-bin/</url> *<port>80</port> *</items> *</root> ************************************************/ /**////<summary> ///查找数据,返回当前节点的所有下级节点,填充到一个DataSet中 ///</summary> ///<paramname="xmlPath">xml文档路径</param> ///<paramname="XmlPathNode">节点的路径:根节点/父节点/当前节点</param> ///<returns></returns> publicstaticDataSetGetXmlData(stringxmlPath,stringXmlPathNode) { XmlDocumentobjXmlDoc=newXmlDocument(); objXmlDoc.Load(xmlPath); DataSetds=newDataSet(); StringReaderread=newStringReader(objXmlDoc.SelectSingleNode(XmlPathNode).OuterXml); ds.ReadXml(read); returnds; } #endregion #region更新Xml节点内容 /**//************************************************** *函数名称:XmlNodeReplace(stringxmlPath,stringNode,stringContent) *功能说明:更新Xml节点内容 *参数:xmlPath:xml文档路径;Node:当前节点的路径;Content:内容 *使用示列: *usingEC;//引用命名空间 *stringxmlPath=Server.MapPath("/EBDomainConfig/DomainConfig.xml");//获取xml路径 *XmlObject.XmlNodeReplace(xmlPath,"root/test","56789");//更新节点内容 ************************************************/ /**////<summary> ///更新Xml节点内容 ///</summary> ///<paramname="xmlPath">xml路径</param> ///<paramname="Node">要更换内容的节点:节点路径根节点/父节点/当前节点</param> ///<paramname="Content">新的内容</param> publicstaticvoidXmlNodeReplace(stringxmlPath,stringNode,stringContent) { XmlDocumentobjXmlDoc=newXmlDocument(); objXmlDoc.Load(xmlPath); objXmlDoc.SelectSingleNode(Node).InnerText=Content; objXmlDoc.Save(xmlPath); } #endregion #region删除XML节点和此节点下的子节点 /**//************************************************** *函数名称:XmlNodeDelete(stringxmlPath,stringNode) *功能说明:删除XML节点和此节点下的子节点 *参数:xmlPath:xml文档路径;Node:当前节点的路径; *使用示列: *usingEC;//引用命名空间 *stringxmlPath=Server.MapPath("/EBDomainConfig/DomainConfig.xml");//获取xml路径 *XmlObject.XmlNodeDelete(xmlPath,"root/test");//删除当前节点 ************************************************/ /**////<summary> ///删除XML节点和此节点下的子节点 ///</summary> ///<paramname="xmlPath">xml文档路径</param> ///<paramname="Node">节点路径</param> publicstaticvoidXmlNodeDelete(stringxmlPath,stringNode) { XmlDocumentobjXmlDoc=newXmlDocument(); objXmlDoc.Load(xmlPath); stringmainNode=Node.Substring(0,Node.LastIndexOf("/")); objXmlDoc.SelectSingleNode(mainNode).RemoveChild(objXmlDoc.SelectSingleNode(Node)); objXmlDoc.Save(xmlPath); } #endregion #region插入一个节点和此节点的子节点 /**//************************************************** *函数名称:XmlInsertNode(stringxmlPath,stringMailNode,stringChildNode,stringElement,stringContent) *功能说明:插入一个节点和此节点的字节点 *参数:xmlPath:xml文档路径;MailNode:当前节点的路径;ChildNode:新插入的节点;Element:插入节点的子节点;Content:子节点的内容 *使用示列: *usingEC;//引用命名空间 *stringxmlPath=Server.MapPath("/EBDomainConfig/DomainConfig.xml");//获取xml路径 *XmlObject.XmlInsertNode(xmlPath,"root/test","test1","test2","测试内容");//插入一个节点和此节点的字节点 *生成的XML格式为 *<test> *<test1> *<test2>测试内容</test2> *</test1> *</test> ************************************************/ /**////<summary> ///插入一个节点和此节点的子节点 ///</summary> ///<paramname="xmlPath">xml路径</param> ///<paramname="MailNode">当前节点路径</param> ///<paramname="ChildNode">新插入节点</param> ///<paramname="Element">插入节点的子节点</param> ///<paramname="Content">子节点的内容,已经应用CDATA</param> publicstaticvoidXmlInsertNode(stringxmlPath,stringMailNode,stringChildNode,stringElement,stringContent) { XmlDocumentobjXmlDoc=newXmlDocument(); objXmlDoc.Load(xmlPath); XmlNodeobjRootNode=objXmlDoc.SelectSingleNode(MailNode); XmlElementobjChildNode=objXmlDoc.CreateElement(ChildNode); objRootNode.AppendChild(objChildNode); XmlElementobjElement=objXmlDoc.CreateElement(Element); XmlCDataSectionxcds=objXmlDoc.CreateCDataSection(Content); objElement.AppendChild(xcds); objChildNode.AppendChild(objElement); objXmlDoc.Save(xmlPath); } #endregion #region插入一节点,带一属性 /**//************************************************** *函数名称:XmlInsertElement(stringxmlPath,stringMainNode,stringElement,stringAttrib,stringAttribContent,stringContent) *功能说明:插入一节点,带一属性 *参数:xmlPath:xml文档路径;MailNode:当前节点的路径;Element:新插入的节点;Attrib:属性名称;AttribContent:属性值;Content:节点的内容 *使用示列: *usingEC;//引用命名空间 *stringxmlPath=Server.MapPath("/EBDomainConfig/DomainConfig.xml");//获取xml路径 *XmlObject.XmlInsertElement(xmlPath,"root/test","test1","Attrib","属性值","节点内容");//插入一节点,带一属性 *生成的XML格式为 *<test> *<test1Attrib="属性值">节点内容</test1> *</test> ************************************************/ /**////<summary> ///插入一节点,带一属性 ///</summary> ///<paramname="xmlPath">Xml文档路径</param> ///<paramname="MainNode">当前节点路径</param> ///<paramname="Element">新节点</param> ///<paramname="Attrib">属性名称</param> ///<paramname="AttribContent">属性值</param> ///<paramname="Content">新节点值</param> publicstaticvoidXmlInsertElement(stringxmlPath,stringMainNode,stringElement,stringAttrib,stringAttribContent,stringContent) { XmlDocumentobjXmlDoc=newXmlDocument(); objXmlDoc.Load(xmlPath); XmlNodeobjNode=objXmlDoc.SelectSingleNode(MainNode); XmlElementobjElement=objXmlDoc.CreateElement(Element); objElement.SetAttribute(Attrib,AttribContent); objElement.InnerText=Content; objNode.AppendChild(objElement); objXmlDoc.Save(xmlPath); } #endregion #region插入一节点不带属性 /**//************************************************** *函数名称:XmlInsertElement(stringxmlPath,stringMainNode,stringElement,stringContent) *功能说明:插入一节点不带属性 *参数:xmlPath:xml文档路径;MailNode:当前节点的路径;Element:新插入的节点;Content:节点的内容 *使用示列: *usingEC;//引用命名空间 *stringxmlPath=Server.MapPath("/EBDomainConfig/DomainConfig.xml");//获取xml路径 *XmlObject.XmlInsertElement(xmlPath,"root/test","text1","节点内容");//插入一节点不带属性 *生成的XML格式为 *<test> *<text1>节点内容</text1> *</test> ************************************************/ publicstaticvoidXmlInsertElement(stringxmlPath,stringMainNode,stringElement,stringContent) { XmlDocumentobjXmlDoc=newXmlDocument(); objXmlDoc.Load(xmlPath); XmlNodeobjNode=objXmlDoc.SelectSingleNode(MainNode); XmlElementobjElement=objXmlDoc.CreateElement(Element); objElement.InnerText=Content; objNode.AppendChild(objElement); objXmlDoc.Save(xmlPath); } #endregion //必须创建对象才能使用的类 privatebool_alreadyDispose=false; privateXmlDocumentxmlDoc=newXmlDocument(); privateXmlNodexmlNode; privateXmlElementxmlElem; #region构造与释构 publicXmlHelper() { } ~XmlHelper() { Dispose(); } protectedvirtualvoidDispose(boolisDisposing) { if(_alreadyDispose)return; if(isDisposing) { // } _alreadyDispose=true; } #endregion #regionIDisposable成员 publicvoidDispose() { Dispose(true); GC.SuppressFinalize(this); } #endregion #region创建xml文档 /**//************************************************** *对象名称:XmlObject *功能说明:创建xml文档 *使用示列: *usingEC;//引用命名空间 *stringxmlPath=Server.MapPath("test.xml"); *XmlObjectobj=newXmlObject(); *创建根节点 *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> ///<paramname="root"></param> publicvoidCreateXmlRoot(stringroot) { //加入XML的声明段落 xmlNode=xmlDoc.CreateNode(XmlNodeType.XmlDeclaration,"",""); xmlDoc.AppendChild(xmlNode); //加入一个根元素 xmlElem=xmlDoc.CreateElement("",root,""); xmlDoc.AppendChild(xmlElem); } #endregion #region在当前节点下插入一个空节点节点 /**////<summary> ///在当前节点下插入一个空节点节点 ///</summary> ///<paramname="mainNode">当前节点路径</param> ///<paramname="node">节点名称</param> publicvoidCreatXmlNode(stringmainNode,stringnode) { XmlNodeMainNode=xmlDoc.SelectSingleNode(mainNode); XmlElementobjElem=xmlDoc.CreateElement(node); MainNode.AppendChild(objElem); } #endregion #region在当前节点插入一个仅带值的节点 /**////<summary> ///在当前节点插入一个仅带值的节点 ///</summary> ///<paramname="mainNode">当前节点</param> ///<paramname="node">新节点</param> ///<paramname="content">新节点值</param> publicvoidCreatXmlNode(stringmainNode,stringnode,stringcontent) { XmlNodeMainNode=xmlDoc.SelectSingleNode(mainNode); XmlElementobjElem=xmlDoc.CreateElement(node); objElem.InnerText=content; MainNode.AppendChild(objElem); } #endregion #region在当前节点的插入一个仅带属性值的节点 /**////<summary> ///在当前节点的插入一个仅带属性值的节点 ///</summary> ///<paramname="MainNode">当前节点或路径</param> ///<paramname="Node">新节点</param> ///<paramname="Attrib">新节点属性名称</param> ///<paramname="AttribValue">新节点属性值</param> publicvoidCreatXmlNode(stringMainNode,stringNode,stringAttrib,stringAttribValue) { XmlNodemainNode=xmlDoc.SelectSingleNode(MainNode); XmlElementobjElem=xmlDoc.CreateElement(Node); objElem.SetAttribute(Attrib,AttribValue); mainNode.AppendChild(objElem); } #endregion #region创建一个带属性值的节点值的节点 /**////<summary> ///创建一个带属性值的节点值的节点 ///</summary> ///<paramname="MainNode">当前节点或路径</param> ///<paramname="Node">节点名称</param> ///<paramname="Attrib">属性名称</param> ///<paramname="AttribValue">属性值</param> ///<paramname="Content">节点传情</param> publicvoidCreatXmlNode(stringMainNode,stringNode,stringAttrib,stringAttribValue,stringContent) { XmlNodemainNode=xmlDoc.SelectSingleNode(MainNode); XmlElementobjElem=xmlDoc.CreateElement(Node); objElem.SetAttribute(Attrib,AttribValue); objElem.InnerText=Content; mainNode.AppendChild(objElem); } #endregion #region在当前节点的插入一个仅带2个属性值的节点 /**////<summary> ///在当前节点的插入一个仅带2个属性值的节点 ///</summary> ///<paramname="MainNode">当前节点或路径</param> ///<paramname="Node">节点名称</param> ///<paramname="Attrib">属性名称一</param> ///<paramname="AttribValue">属性值一</param> ///<paramname="Attrib2">属性名称二</param> ///<paramname="AttribValue2">属性值二</param> publicvoidCreatXmlNode(stringMainNode,stringNode,stringAttrib,stringAttribValue,stringAttrib2,stringAttribValue2) { XmlNodemainNode=xmlDoc.SelectSingleNode(MainNode); XmlElementobjElem=xmlDoc.CreateElement(Node); objElem.SetAttribute(Attrib,AttribValue); objElem.SetAttribute(Attrib2,AttribValue2); mainNode.AppendChild(objElem); } #endregion #region在当前节点插入带两个属性的节点 /**////<summary> ///在当前节点插入带两个属性的节点 ///</summary> ///<paramname="MainNode">当前节点或路径</param> ///<paramname="Node">节点名称</param> ///<paramname="Attrib">属性名称一</param> ///<paramname="AttribValue">属性值一</param> ///<paramname="Attrib2">属性名称二</param> ///<paramname="AttribValue2">属性值二</param> ///<paramname="Content">节点值</param> publicvoidCreatXmlNode(stringMainNode,stringNode,stringAttrib,stringAttribValue,stringAttrib2,stringAttribValue2,stringContent) { XmlNodemainNode=xmlDoc.SelectSingleNode(MainNode); XmlElementobjElem=xmlDoc.CreateElement(Node); objElem.SetAttribute(Attrib,AttribValue); objElem.SetAttribute(Attrib2,AttribValue2); objElem.InnerText=Content; mainNode.AppendChild(objElem); } #endregion #region保存Xml /**////<summary> ///保存Xml ///</summary> ///<paramname="path">保存的当前路径</param> publicvoidXmlSave(stringpath) { xmlDoc.Save(path); } #endregion #endregion #region根据父节点属性值读取子节点值 /**//************************************************** *函数名称:GetSubElementByAttribute(stringXmlPath,stringFatherElenetName,stringAttributeName,intAttributeIndex,intArrayLength) *功能说明:根据父节点属性值读取子节点值 *参数:XmlPath:xml路径;FatherElenetName:父节点名;AttributeName:属性值;AttributeIndex:属性索引;ArrayLength:要返回的节点数组长度 *适应用Xml: *ArrayListal=newArrayList(); *al=EC.XmlObject.GetSubElementByAttribute(XmlPath,"page","/index.aspx",0,3); *for(inti=0;i<al.Count;i++) *{ *Response.Write(al[i].ToString()); *Response.Write("<br>"); *} ************************************************/ /**////<summary> ///根据父节点属性读取字节点值 ///</summary> ///<paramname="XmlPath">xml路径</param> ///<paramname="FatherElenetName">父节点名</param> ///<paramname="AttributeName">属性值</param> ///<paramname="AttributeIndex">属性索引</param> ///<paramname="ArrayLength">要返回的节点数组长度</param> ///<returns></returns> publicstaticSystem.Collections.ArrayListGetSubElementByAttribute(stringXmlPath,stringFatherElenetName,stringAttributeName,intAttributeIndex,intArrayLength) { System.Collections.ArrayListal=newSystem.Collections.ArrayList(); XmlDocumentdocXml=newXmlDocument(); docXml.Load(@XmlPath); XmlNodeListxn=docXml.DocumentElement.ChildNodes; //遍历第一层节点 foreach(XmlElementelementinxn) { //判断父节点是否为指定节点 if(element.Name==FatherElenetName) { //判断父节点属性的索引是否大于指定索引 if(element.Attributes.Count<AttributeIndex) returnnull; //判断父节点的属性值是否等于指定属性 if(element.Attributes[AttributeIndex].Value==AttributeName) { XmlNodeListxx=element.ChildNodes; if(xx.Count>0) { for(inti=0;i<ArrayLength&i<xx.Count;i++) { al.Add(xx[i].InnerText); } } } } } returnal; } #endregion #region根据节点属性读取子节点值(较省资源模式) /**//************************************************** *函数名称:GetSubElementByAttribute(stringXmlPath,stringFatherElement,stringAttributeName,stringAttributeValue,intArrayLength) *功能说明:根据父节点属性值读取子节点值 *参数:XmlPath:xml路径;FatherElenetName:父节点名;AttributeName:属性名;AttributeValue:属性值;ArrayLength:要返回的节点数组长度 *适应用Xml: *ArrayListal=newArrayList(); *al=EC.XmlObject.GetSubElementByAttribute(XmlPath,"page","@name","/index.aspx",3); *for(inti=0;i<al.Count;i++) *{ *Response.Write(al[i].ToString()); *Response.Write("<br>"); *} ************************************************/ /**////<summary> ///根据节点属性读取子节点值(较省资源模式) ///</summary> ///<paramname="XmlPath">xml路径</param> ///<paramname="FatherElement">父节点值</param> ///<paramname="AttributeName">属性名称</param> ///<paramname="AttributeValue">属性值</param> ///<paramname="ArrayLength">返回的数组长度</param> ///<returns></returns> publicstaticSystem.Collections.ArrayListGetSubElementByAttribute(stringXmlPath,stringFatherElement,stringAttributeName,stringAttributeValue,intArrayLength) { System.Collections.ArrayListal=newSystem.Collections.ArrayList(); XmlDocumentdocXml=newXmlDocument(); docXml.Load(@XmlPath); XmlNodeListxn; xn=docXml.DocumentElement.SelectNodes("//"+FatherElement+"["+@AttributeName+"='"+AttributeValue+"']"); XmlNodeListxx=xn.Item(0).ChildNodes; for(inti=0;i<ArrayLength&i<xx.Count;i++) { al.Add(xx.Item(i).InnerText); } returnal; } #endregion } }
更多关于C#相关内容感兴趣的读者可查看本站专题:《C#程序设计之线程使用技巧总结》、《C#操作Excel技巧总结》、《C#中XML文件操作技巧汇总》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》、《C#数组操作技巧总结》及《C#面向对象程序设计入门教程》
希望本文所述对大家C#程序设计有所帮助。