简单XML文件C#操作方法
生活随笔
收集整理的這篇文章主要介紹了
简单XML文件C#操作方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
XML數據文件靈活而強大,在C#中,操作起來也十分方便.我們常用XML文件保存少量的數據,如系統配置信息,用戶個性數據...,而對這些數據的操作最常用的就是讀取,寫入和刪除相關的結點.本人的實際的應用過程中,逐步形成了以下XML配置文件的操作類.下面的這個類為大家提供了一系列更加簡捷的操作方法,無需再考慮文件或結點是否存在.
代碼 using?System;using?System.Collections.Generic;
using?System.Text;
using?System.IO;
using?System.Xml;
using?System.Xml.XPath;
namespace?LuckerSoft
{
????///?<summary>
????///?該XML文件操作類提供一系統自動完成的操作類.包括常用的數據讀取,寫入與刪除.
????///?支持非字符型數據(即所有支持序列化的object類型)的操作.
????///?并具有文件或結點不存在時自動創建的功能.
????///?該類采用靜態類設計,用類名直接調用其公有方法,主要適用于對XML文件中單個結點的操作
????///?作者:Lucker
????///?日期:2009年12月29日
????///?版本:1.0.0
????///?</summary>
????public?static?class?MyXML
????{
????????///?<summary>
????????///?從指定的XML文件中讀取指定路徑下所有結點的值
????????///?</summary>
????????///?<param?name="XMLFile">帶路徑的XML文件名</param>
????????///?<param?name="Path">帶路徑的結點名</param>
????????///?<returns></returns>
????????public?static?string[]?ReadNodes(string?XMLFile,?string?Path)
????????{
????????????string?Values="";????????????
????????????XmlDocument?xmldoc?=?CheckFileExit(XMLFile);
????????????XmlNode?Node?=?FindNode(xmldoc,?Path);
????????????foreach?(XmlNode?node?in?Node.ChildNodes)
????????????{
????????????????Values?+=?node.Name.ToString()?+?",";
????????????}
????????????return?Values.Split(new?char[]?{?','?},?StringSplitOptions.RemoveEmptyEntries);
????????}
????????
????????///?<summary>
????????///?從指定的XML文件中讀取指定路徑下單個結點的值.當結點不存在時,根據所提供默認值自動創建.
????????///?</summary>
????????///?<param?name="XMLFile"></param>
????????///?<param?name="Path"></param>
????????///?<param?name="DefaultValue">結點不存在時,提供的默認值</param>
????????///?<returns></returns>
????????public?static?string?ReadNode(string?XMLFile,?string?Path,?string?DefaultValue)
????????{
????????????XmlDocument?xmldoc?=?CheckFileExit(XMLFile);
????????????XmlNode?Node?=?FindNode(xmldoc,?Path);
????????????if?(Node?!=?null)
????????????{
????????????????return?Node.InnerText;
????????????}
????????????else
????????????{
????????????????WriteNode(XMLFile,?Path,?DefaultValue);
????????????????return?DefaultValue;
????????????}
????????}
????????///?<summary>
????????///?讀取一個object類型的結點數據.
????????///?</summary>
????????///?<param?name="XMLFile"></param>
????????///?<param?name="Path"></param>
????????///?<param?name="DefaultValue">object類型的數據實際上是經過序列化后轉換成string保存在文件中的</param>
????????///?<returns></returns>
????????public?static?object?ReadNode(string?XMLFile,?string?Path,?object?DefaultValue)
????????{
????????????//讀出文件中的string值
????????????string?Value=ReadNode(XMLFile,?Path,?Object2String(DefaultValue));
????????????//再將讀取出來的string數據需要轉化成object對象.
????????????object?o=?String2Object(Value);
????????????return?o;
????????}
????????
????????///?<summary>
????????///?向指定的XML文件中寫入指定路徑的結點數據.當指定結點不存在是時,將沿路徑依次創建各父結點
????????///?</summary>
????????///?<param?name="XMLFile"></param>
????????///?<param?name="Path"></param>
????????///?<param?name="Value">結點值</param>
????????public?static?void?WriteNode(string?XMLFile,?string?Path,?string?Value)
????????{
????????????XmlDocument?myDoc?=?CheckFileExit(XMLFile);
????????????PathNode?=?null;
????????????PathDepth?=?0;
????????????ParentNode?=?null;
????????????CheckPath(myDoc,?Path);
????????????XmlNode?Node?=?FindNode(myDoc,?Path);
????????????if?(Node?!=?null)
????????????{
????????????????UpdateXmlNode(Value,?Node);
????????????}
????????????myDoc.Save(XMLFile);
????????}
????????
????????///?<summary>
????????///?寫入一個object類型的對象.
????????///?</summary>
????????///?<param?name="XMLFile"></param>
????????///?<param?name="Path"></param>
????????///?<param?name="Value"></param>
????????public?static?void?WriteNode(string?XMLFile,?string?Path,?object?Value)
????????{
????????????//經序列化后轉換成string型后再寫入.
????????????WriteNode(XMLFile,?Path,?Object2String(Value));
????????}
????????///?<summary>
????????///?刪除指定的結點
????????///?</summary>
????????///?<param?name="XMLFile"></param>
????????///?<param?name="Path"></param>
????????///?<returns></returns>
????????public?static?bool?DeleteNode(string?XMLFile,?string?Path)
????????{
????????????XmlDocument?myDoc?=?CheckFileExit(XMLFile);
????????????XmlNode?Node?=?FindNode(myDoc,?Path);
????????????if(Node!=null)
????????????{
????????????????if?(Node.ParentNode?!=?null)
????????????????{
????????????????????Node.ParentNode.RemoveChild(Node);
????????????????}
????????????????else
????????????????{
????????????????????myDoc.RemoveChild(Node);
????????????????}
????????????????myDoc.Save(XMLFile);
????????????}
????????????return?true;
????????}
????????
????????#region?私有方法
????????///?<summary>
????????///?更新指定結點的值
????????///?</summary>
????????///?<param?name="TextName">結點的值</param>
????????///?<param?name="XNe">要更新的結點</param>
????????///?<returns></returns>
????????private?static?bool?UpdateXmlNode(string?TextName,?XmlNode?XNe)
????????{
????????????if?(XNe?!=?null)
????????????{
????????????????XNe.InnerText?=?TextName;
????????????????return?true;
????????????}
????????????else
????????????????return?false;
????????}
????????
????????///?<summary>
????????///?插入一個指定的XML元素
????????///?</summary>
????????///?<param?name="myDoc"></param>
????????///?<param?name="ElementName">元素名</param>
????????///?<param?name="Text">元素值</param>
????????///?<returns></returns>
????????private?static?XmlNode?InsertXmlElement(XmlDocument?myDoc,?string?ElementName,?string?Text)
????????{
????????????if?(ElementName?!=?"")
????????????{
????????????????XmlElement?XEt?=?myDoc.CreateElement("",ElementName,"");
????????????????XEt.InnerText?=?Text;
????????????????return?(XmlNode)XEt;
????????????}
????????????else
????????????{
????????????????return?null;
????????????}
????????}
????????
????????static?string[]?PathNode?=?null;
????????static?int?PathDepth=0;
????????static?XmlNode?ParentNode;
????????///?<summary>
????????///?獲取路徑結點集指定深度的路徑表示
????????///?</summary>
????????///?<param?name="depth"></param>
????????///?<returns></returns>
????????private?static?string?GetPath(int?depth)
????????{
????????????string?path?=?"";
????????????for?(int?i?=?0;?i?<?depth?&&?i?<?PathNode.Length;?i++)
????????????{
????????????????path?+=?PathNode[i]?+?"/";
????????????}
????????????return?path.Substring(0,path.Length?-?1);
????????}
????????
????????///?<summary>
????????///?遞歸檢查指定路徑上的結點是否存在,不存在則創建
????????///?</summary>
????????///?<param?name="myDoc"></param>
????????///?<param?name="Path"></param>
????????private?static?void?CheckPath(XmlDocument?myDoc,?string?Path)
????????{
????????????if?(PathNode?==?null)
????????????{
????????????????PathNode?=?Path.Split(new?char[]?{?'/'?});
????????????????PathDepth?=?0;
????????????}
????????????if?(PathDepth?<?PathNode.Length)
????????????{
????????????????string?NewPath?=?GetPath(++PathDepth);
????????????????string?Name?=?PathNode[PathDepth-1];
????????????????XmlNode?Node?=?FindNode(myDoc,?NewPath);
????????????????if?(Node?==?null)
????????????????{
????????????????????XmlNode?NewNode?=?InsertXmlElement(myDoc,?Name,?null);
????????????????????ParentNode.AppendChild(NewNode);
????????????????????ParentNode?=?FindNode(myDoc,?NewPath);
????????????????}
????????????????else
????????????????{
????????????????????ParentNode?=?Node;
????????????????}
????????????????CheckPath(myDoc,?NewPath);
????????????}
????????}
????????
????????///?<summary>
????????///?查詢指定路徑上的第一個結點
????????///?</summary>
????????///?<param?name="myDoc"></param>
????????///?<param?name="Path"></param>
????????///?<returns></returns>
????????private?static?XmlNode?FindNode(XmlDocument?myDoc,?string?Path)
????????{
????????????//Path:aaaa/bbbb/cccc
????????????XmlNode?myNode?=?myDoc.SelectSingleNode(Path);
????????????if?(!(myNode?==?null))
????????????{
????????????????return?myNode;
????????????}
????????????return?null;
????????}
????????
????????///?<summary>
????????///?查詢指定路徑上的所有結點
????????///?</summary>
????????///?<param?name="myDoc"></param>
????????///?<param?name="Path"></param>
????????///?<returns></returns>
????????private?static?XmlNodeList?FindNodes(XmlDocument?myDoc,?string?Path)
????????{
????????????//Path:aaaa/bbbb/cccc
????????????XmlNodeList?myNodeList?=?myDoc.SelectNodes(Path);
????????????if?(!(myNodeList?==?null))
????????????{
????????????????return?myNodeList;
????????????}
????????????return?null;
????????}
????????
????????///?<summary>
????????///?查詢指定的XML文件是否存在.如果不存在,則創建一個具有默認根結點的XML文件.
????????///?</summary>
????????///?<param?name="XMLFile"></param>
????????///?<returns></returns>
????????private?static?XmlDocument?CheckFileExit(string?XMLFile)
????????{
????????????XmlDocument?xmldoc?=?new?XmlDocument();
????????????if?(File.Exists(XMLFile))
????????????{
????????????????try
????????????????{
????????????????????xmldoc.Load(XMLFile);
????????????????}
????????????????catch?(Exception?ex)
????????????????{
????????????????????throw?new?Exception("載入XML文件["?+?XMLFile?+?"]失敗.\r\n"+ex.Message);
????????????????}
????????????}
????????????else
????????????{
????????????????XmlDeclaration?xn?=?xmldoc.CreateXmlDeclaration("1.0",?"gb2312",?null);
????????????????xmldoc.AppendChild(xn);
????????????????XmlElement?xmlelem?=?xmldoc.CreateElement("",?"打印項目模板",?"");
????????????????xmldoc.AppendChild(xmlelem);
????????????????xmldoc.Save(XMLFile);
????????????}
????????????return?xmldoc;
????????}
????????///???<summary>
????????///???序列化為二進制字節數組
????????///???</summary>
????????///???<param???name="request">要序列化的對象</param>
????????///???<returns>字節數組</returns>
????????private?static?byte[]?SerializeBinary(object?request)
????????{
????????????System.Runtime.Serialization.Formatters.Binary.BinaryFormatter?serializer?=?new?System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
????????????System.IO.MemoryStream?memStream?=?new?System.IO.MemoryStream();
????????????serializer.Serialize(memStream,?request);
????????????return?memStream.GetBuffer();
????????}
????????///???<summary>
????????///???從二進制數組反序列化得到對象
????????///???</summary>
????????///???<param???name="buf">字節數組</param>
????????///???<returns>得到的對象</returns>
????????private?static?object?DeserializeBinary(byte[]?buf)
????????{
????????????System.IO.MemoryStream?memStream?=?new?MemoryStream(buf);
????????????memStream.Position?=?0;
????????????System.Runtime.Serialization.Formatters.Binary.BinaryFormatter?deserializer?=
????????????????new?System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
????????????object?newobj?=?deserializer.Deserialize(memStream);
????????????memStream.Close();
????????????return?newobj;
????????}
????????
????????private?static?string?Object2String(object?Obj)
????????{
????????????StringBuilder?sb?=?new?StringBuilder();
????????????byte[]?ByteObject?=?SerializeBinary(Obj);
????????????foreach?(byte?b?in?ByteObject)
????????????{
????????????????sb.Append(((int)b).ToString());
????????????????sb.Append(",");
????????????}
????????????return?sb.Remove(sb.Length-1,1).ToString();
????????}
????????
????????private?static?object?String2Object(string?Value)
????????{
????????????string[]?V?=?Value.Split(new?char[]?{?','?},StringSplitOptions.RemoveEmptyEntries);
????????????byte[]?ByteObject?=?new?byte[V.Length];
????????????for(int?i=0;i<ByteObject.Length;i++)
????????????{
????????????????ByteObject[i]?=?Convert.ToByte(V[i]);
????????????}
????????????return?DeserializeBinary(ByteObject);
????????}
????????
????????#endregion
????}
}
?
?
?
?
轉載于:https://www.cnblogs.com/luckeryin/archive/2009/12/29/1635203.html
總結
以上是生活随笔為你收集整理的简单XML文件C#操作方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 此心拖泥带水,是人生最苦处
- 下一篇: CSS部分样式图解