從第一次接觸 XML 開始就想寫一個能實現 Tree 與 XML 靈活轉換的類別了。
寫這個類別大概用去了將近半天的時間,花的時間有些長了。呵呵。。好在收穫頗多,熟練了 XML 的讀寫類別,對 C# 中的 foreach 迴圈也有了更深的認識。
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Xml;
namespace TreeExXML
{
class TreeExXMLCls
{
private TreeView thetreeView;
private string XMLfilepath;
XmlTextWriter textWriter;
XmlNode XMLroot;
XmlDocument textdoc;
public TreeExXMLCls()
{
// 建構函式
textdoc = new XmlDocument();
}
~TreeExXMLCls()
{
// 解構函式
}
#region 遍歷 treeView 並實現向 XML 的轉換
/// <summary>
/// 遍歷 treeView 並實現向 XML 的轉換
/// </summary>
/// <param name="TheTreeView">樹控制項物件</param>
/// <param name="XMLFilePath">XML 輸出路徑</param>
/// <returns>0 表示函式順利執行</returns>
public int TreeToXML(TreeView TheTreeView, string XMLFilePath)
{
// 初始化轉換環境變數
thetreeView = TheTreeView;
XMLfilepath = XMLFilePath;
textWriter = new XmlTextWriter(XMLfilepath, null);
// 建立 XML 寫入物件
textWriter.Formatting = Formatting.Indented;
// 開始寫入過程,呼叫 WriteStartDocument 方法
textWriter.WriteStartDocument();
// 寫入說明
textWriter.WriteComment("this XML is created from a tree");
textWriter.WriteComment("By 思月行雲");
// 新增第一個根節點
textWriter.WriteStartElement("TreeExXMLCls");
textWriter.WriteEndElement();
// 寫入文件結尾,呼叫 WriteEndDocument 方法
textWriter.WriteEndDocument();
// 關閉輸出流
textWriter.Close();
// 建立 XmlDocument 物件
textdoc.Load(XMLfilepath);
// 選取根節點
XmlElement XMLnode = textdoc.CreateElement(thetreeView.Nodes[0].Text);
XMLroot = textdoc.SelectSingleNode("TreeExXMLCls");
// 遍歷原 treeView 控制項,並產生相應的 XML
TransTreeSav(thetreeView.Nodes, (XmlElement)XMLroot);
return 0;
}
private int TransTreeSav(TreeNodeCollection nodes, XmlElement ParXMLnode)
{
// 遍歷樹的各個節點,同時新增節點至 XML
XmlElement XMLnode;
XMLroot = textdoc.SelectSingleNode("TreeExXMLCls");
foreach (TreeNode node in nodes)
{
XMLnode = textdoc.CreateElement(node.Text);
ParXMLnode.AppendChild(XMLnode);
if (node.Nodes.Count > 0)
{
TransTreeSav(node.Nodes, XMLnode);
}
}
textdoc.Save(XMLfilepath);
return 0;
}
#endregion
#region 遍歷 XML 並實現向 Tree 的轉換
/// <summary>
/// 遍歷 XML 並實現向 Tree 的轉換
/// </summary>
/// <param name="XMLFilePath">XML 輸出路徑</param>
/// <param name="TheTreeView">樹控制項物件</param>
/// <returns>0 表示函式順利執行</returns>
public int XMLToTree(string XMLFilePath, TreeView TheTreeView)
{
// 重新初始化轉換環境變數
thetreeView = TheTreeView;
XMLfilepath = XMLFilePath;
// 重新對 XmlDocument 物件賦值
textdoc.Load(XMLfilepath);
XmlNode root = textdoc.SelectSingleNode("TreeExXMLCls");
foreach (XmlNode subXMLnode in root.ChildNodes)
{
TreeNode treeRootNode = new TreeNode();
treeRootNode.Text = subXMLnode.Name;
thetreeView.Nodes.Add(treeRootNode);
TransXML(subXMLnode.ChildNodes, treeRootNode);
}
return 0;
}
private int TransXML(XmlNodeList XMLnodes, TreeNode parentNode)
{
// 遍歷 XML 中的所有節點,仿照 TreeView 節點遍歷函式
foreach (XmlNode xmlNode in XMLnodes)
{
TreeNode subTreeNode = new TreeNode();
subTreeNode.Text = xmlNode.Name;
parentNode.Nodes.Add(subTreeNode);
if (xmlNode.ChildNodes.Count > 0)
{
TransXML(xmlNode.ChildNodes, subTreeNode);
}
}
return 0;
}
#endregion
}
}