C#XMLプロファイル読み書きクラス(プログラム構成保存用)

3340 ワード

C#XMLプロファイル読み書きクラス(プログラム構成保存用)
2014-08-27 
分類:プログラミング技術
読み取り(3930)
コメント(2)
以前からINI方式でプログラムの配置保存をしていたので、便利でした.
拡張性を向上させるために、今日はxmlでプロファイルの読み書きを行います.
コールモード
//ファイルパスを初期化して指定する
XmlConfigUtil util = new XmlConfigUtil("C:\\1.xml");
 
//保存する値およびパス(System、Menu.....いずれもパス)params string[]を書き込む方法util.Write("testValue", "System", "Menu");
 
//システム/Menuの値を読み込む
Console.WriteLine(util.Read("System", "Menu"));
ファイルパスが存在する場合は正常に読み込み、存在しない場合は自動的に作成されます.
 
ソースコード
以下はXmlConfigUtilのソースコードです.ここでは随時更新します.
///
//説明:プログラム構成保存ヘルプクラスfor XML //更新:http://www.wxzzz.com/1352.html
///
public class XmlConfigUtil
{
#regionグローバル変数    string _xmlPath;//ファイル所在経路    #endregion
 
#regionコンストラクション関数   ///
//構成を初期化
   ///
//配置所在経路    public XmlConfigUtil(string xmlPath)
    {
        _xmlPath = Path.GetFullPath(xmlPath);
    }
    #endregion
 
#region共有方法   ///
//書き込み構成   ///
//書き込み値//ノード    public void Write(string value, params string[] nodes)
    {
//初期化xml         XmlDocument xmlDoc = new XmlDocument();
        if (File.Exists(_xmlPath))
            xmlDoc.Load(_xmlPath);
        else
            xmlDoc.LoadXml("");
        XmlNode xmlRoot = xmlDoc.ChildNodes[0];
 
//ノードの追加、編集
        string xpath = string.Join("/", nodes);
        XmlNode node = xmlDoc.SelectSingleNode(xpath);
if(node==null)/新規ノード        {
            node = makeXPath(xmlDoc, xmlRoot, xpath);
        }
        node.InnerText = value;
 
//保存        xmlDoc.Save(_xmlPath);
    }
 
   ///
//読み出し構成   ///
//ノード   ///
    public string Read(params string[] nodes)
    {
        XmlDocument xmlDoc = new XmlDocument();
        if (File.Exists(_xmlPath) == false)
            return null;
        else
            xmlDoc.Load(_xmlPath);
 
        string xpath = string.Join("/", nodes);
        XmlNode node = xmlDoc.SelectSingleNode("/XmlConfig/"+ xpath);
        if (node == null)
            return null;
 
        return node.InnerText;
    }
    #endregion
 
#regionプライベートメソッド//再帰xpathによるノード作成    static private XmlNode makeXPath(XmlDocument doc, XmlNode parent, string xpath)
    {
 
//XPathで次のノードの名前をつかむ;親が空の場合はを返します.
        string[] partsOfXPath = xpath.Trim('/').Split('/');
        string nextNodeInXPath = partsOfXPath.First();
        if (string.IsNullOrEmpty(nextNodeInXPath))
            return parent;
 
//名前からノードを取得または作成する
        XmlNode node = parent.SelectSingleNode(nextNodeInXPath);
        if (node == null)
            node = parent.AppendChild(doc.CreateElement(nextNodeInXPath));
 
//XPath式と再帰剰余として追加されたアレイ
        string rest = String.Join("/", partsOfXPath.Skip(1).ToArray());
        return makeXPath(doc, node, rest);
    }
    #endregion
}