C#操作XML通用方法汇总
在.net的项目开发中,经常会对XML文件进行操作,由于XML文件可以实现跨平台传输,较多的应用在数据传输中,特总结以下几种常用的XML操作方法:
1.创建XML文档:
///<summary> ///创建XML文档 ///</summary> ///<paramname="name">根节点名称</param> ///<paramname="type">根节点的一个属性值</param> ///<returns>XmlDocument对象</returns> publicstaticXmlDocumentCreateXmlDocument(stringname,stringtype) { XmlDocumentdoc; try { doc=newXmlDocument(); doc.LoadXml("<"+name+"/>"); varrootEle=doc.DocumentElement; rootEle?.SetAttribute("type",type); } catch(Exceptioner) { thrownewException(er.ToString()); } returndoc; }
2.读取XML文档中的数据:
///<summary> ///读取数据 ///</summary> ///<paramname="path">路径</param> ///<paramname="node">节点</param> ///<paramname="attribute">属性名,非空时返回该属性值,否则返回串联值</param> ///<returns>string</returns> publicstaticstringRead(stringpath,stringnode,stringattribute) { varvalue=""; try { vardoc=newXmlDocument(); doc.Load(path); varxn=doc.SelectSingleNode(node); if(xn!=null&&xn.Attributes!=null) value=(attribute.Equals("")?xn.InnerText:xn.Attributes[attribute].Value); } catch(Exceptioner) { thrownewException(er.ToString()); } returnvalue; }
3.对XML文档插入数据:
///<summary> ///插入数据 ///</summary> ///<paramname="path">路径</param> ///<paramname="node">节点</param> ///<paramname="element">元素名,非空时插入新元素,否则在该元素中插入属性</param> ///<paramname="attribute">属性名,非空时插入该元素属性值,否则插入元素值</param> ///<paramname="value">值</param> ///<returns></returns> publicstaticvoidInsert(stringpath,stringnode,stringelement,stringattribute,stringvalue) { try { vardoc=newXmlDocument(); doc.Load(path); varxn=doc.SelectSingleNode(node); if(element.Equals("")) { if(!attribute.Equals("")) { varxe=(XmlElement)xn; xe?.SetAttribute(attribute,value); //xe?.SetAttribute(attribute,value); } } else { varxe=doc.CreateElement(element); if(attribute.Equals("")) xe.InnerText=value; else xe.SetAttribute(attribute,value); xn?.AppendChild(xe); } doc.Save(path); } catch(Exceptioner) { thrownewException(er.ToString()); } }
4.修改XML文档中的数据:
///<summary> ///修改数据 ///</summary> ///<paramname="path">路径</param> ///<paramname="node">节点</param> ///<paramname="attribute">属性名,非空时修改该节点属性值,否则修改节点值</param> ///<paramname="value">值</param> ///<returns></returns> publicstaticvoidUpdate(stringpath,stringnode,stringattribute,stringvalue) { try { vardoc=newXmlDocument(); doc.Load(path); varxn=doc.SelectSingleNode(node); varxe=(XmlElement)xn; if(attribute.Equals("")) { if(xe!=null)xe.InnerText=value; } else { xe?.SetAttribute(attribute,value); } doc.Save(path); } catch(Exceptioner) { thrownewException(er.ToString()); } }
5.删除XML文档中数据:
///<summary> ///删除数据 ///</summary> ///<paramname="path">路径</param> ///<paramname="node">节点</param> ///<paramname="attribute">属性名,非空时删除该节点属性值,否则删除节点值</param> ///<returns></returns> publicstaticvoidDelete(stringpath,stringnode,stringattribute) { try { vardoc=newXmlDocument(); doc.Load(path); varxn=doc.SelectSingleNode(node); varxe=(XmlElement)xn; if(attribute.Equals("")) { xn?.ParentNode?.RemoveChild(xn); } else { xe?.RemoveAttribute(attribute); } doc.Save(path); } catch(Exceptioner) { thrownewException(er.ToString()); } }
6.读取XML文档中指定节点数据:
///<summary> ///获得xml文件中指定节点的节点数据 ///</summary> ///<paramname="path"></param> ///<paramname="nodeName"></param> ///<returns></returns> publicstaticstringGetNodeInfoByNodeName(stringpath,stringnodeName) { varxmlString=string.Empty; try { varxml=newXmlDocument(); xml.Load(path); varroot=xml.DocumentElement; if(root==null)returnxmlString; varnode=root.SelectSingleNode("//"+nodeName); if(node!=null) { xmlString=node.InnerText; } } catch(Exceptioner) { thrownewException(er.ToString()); } returnxmlString; }
7.获取XML指定节点的属性:
///<summary> ///功能:读取指定节点的指定属性值 ///</summary> ///<paramname="path"></param> ///<paramname="strNode">节点名称</param> ///<paramname="strAttribute">此节点的属性</param> ///<returns></returns> publicstringGetXmlNodeAttributeValue(stringpath,stringstrNode,stringstrAttribute) { varstrReturn=""; try { varxml=newXmlDocument(); xml.Load(path); //根据指定路径获取节点 varxmlNode=xml.SelectSingleNode(strNode); if(xmlNode!=null) { //获取节点的属性,并循环取出需要的属性值 varxmlAttr=xmlNode.Attributes; if(xmlAttr==null)returnstrReturn; for(vari=0;i<xmlAttr.Count;i++) { if(xmlAttr.Item(i).Name!=strAttribute)continue; strReturn=xmlAttr.Item(i).Value; break; } } } catch(XmlExceptionxmle) { thrownewException(xmle.Message); } returnstrReturn; }
8.设置XML文档中指定节点的属性:
///<summary> ///功能:设置节点的属性值 ///</summary> ///<paramname="path"></param> ///<paramname="xmlNodePath">节点名称</param> ///<paramname="xmlNodeAttribute">属性名称</param> ///<paramname="xmlNodeAttributeValue">属性值</param> publicvoidSetXmlNodeAttributeValue(stringpath,stringxmlNodePath,stringxmlNodeAttribute,stringxmlNodeAttributeValue) { try { varxml=newXmlDocument(); xml.Load(path); //可以批量为符合条件的节点的属性付值 varxmlNode=xml.SelectNodes(xmlNodePath); if(xmlNode==null)return; foreach(varxmlAttrinfromXmlNodexninxmlNodeselectxn.Attributes) { if(xmlAttr==null)return; for(vari=0;i<xmlAttr.Count;i++) { if(xmlAttr.Item(i).Name!=xmlNodeAttribute)continue; xmlAttr.Item(i).Value=xmlNodeAttributeValue; break; } } } catch(XmlExceptionxmle) { thrownewException(xmle.Message); } }
9.读取XML文档指定节点的值:
///<summary> ///读取XML资源中的指定节点内容 ///</summary> ///<paramname="source">XML资源</param> ///<paramname="xmlType">XML资源类型:文件,字符串</param> ///<paramname="nodeName">节点名称</param> ///<returns>节点内容</returns> publicstaticobjectGetNodeValue(stringsource,XmlTypexmlType,stringnodeName) { varxd=newXmlDocument(); if(xmlType==XmlType.File) { xd.Load(source); } else { xd.LoadXml(source); } varxe=xd.DocumentElement; XmlNodexn=null; if(xe!=null) { xn=xe.SelectSingleNode("//"+nodeName); } returnxn.InnerText; }
10.更新XML文档指定节点的内容:
///<summary> ///更新XML文件中的指定节点内容 ///</summary> ///<paramname="filePath">文件路径</param> ///<paramname="nodeName">节点名称</param> ///<paramname="nodeValue">更新内容</param> ///<returns>更新是否成功</returns> publicstaticboolUpdateNode(stringfilePath,stringnodeName,stringnodeValue) { try { boolflag; varxd=newXmlDocument(); xd.Load(filePath); varxe=xd.DocumentElement; if(xe==null)returnfalse; varxn=xe.SelectSingleNode("//"+nodeName); if(xn!=null) { xn.InnerText=nodeValue; flag=true; } else { flag=false; } returnflag; } catch(Exceptionex) { thrownewException(ex.Message); } } 复制代码 11.将对象转化为XML文件,并存入指定目录: 复制代码 ///<summary> ///将对象转化为xml,并写入指定路径的xml文件中 ///</summary> ///<typeparamname="T">C#对象名</typeparam> ///<paramname="item">对象实例</param> ///<paramname="path">路径</param> ///<paramname="jjdbh">标号</param> ///<paramname="ends">结束符号(整个xml的路径类似如下:C:\xmltest\201111send.xml,其中path=C:\xmltest,jjdbh=201111,ends=send)</param> ///<returns></returns> publicstaticstringWriteXml<T>(Titem,stringpath,stringjjdbh,stringends) { if(string.IsNullOrEmpty(ends)) { //默认为发送 ends="send"; } //控制写入文件的次数 vari=0; //获取当前对象的类型,也可以使用反射typeof(对象名) varserializer=newXmlSerializer(item.GetType()); //xml的路径组合 object[]obj={path,"\\",jjdbh,ends,".xml"}; varxmlPath=string.Concat(obj); while(true) { try { //用filestream方式创建文件不会出现“文件正在占用中,用File.create”则不行 varfs=System.IO.File.Create(xmlPath); fs.Close(); TextWriterwriter=newStreamWriter(xmlPath,false,Encoding.UTF8); varxml=newXmlSerializerNamespaces(); xml.Add(string.Empty,string.Empty); serializer.Serialize(writer,item,xml); writer.Flush(); writer.Close(); break; } catch(Exception) { if(i<5) { i++; continue; } break; } } returnSerializeToXmlStr<T>(item,true); }
12.向一个已经存在的父节点中插入一个子节点:
///<summary> ///向一个已经存在的父节点中插入一个子节点 ///</summary> ///<paramname="path"></param> ///<paramname="parentNodePath">父节点</param> ///<paramname="childnodename">子节点名称</param> publicvoidAddChildNode(stringpath,stringparentNodePath,stringchildnodename) { try { varxml=newXmlDocument(); xml.Load(path); varparentXmlNode=xml.SelectSingleNode(parentNodePath); XmlNodechildXmlNode=xml.CreateElement(childnodename); if((parentXmlNode)!=null) { //如果此节点存在 parentXmlNode.AppendChild(childXmlNode); } else { //如果不存在就放父节点添加 GetXmlRoot(path).AppendChild(childXmlNode); } } catch(XmlExceptionxmle) { thrownewException(xmle.Message); } }
以上的方法总结采用.net4.5版本和c#6.0语法,希望对大家的学习有所帮助,也希望大家多多支持毛票票。