我的一段程序,用于XML文件的创建,及节点的读与写操作
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.IO;
namespace PersonalTimer
{
class OperateXML
{
string fileName;
XmlDocument xmlDoc;
XmlElement xmlElement;
public OperateXML(string xmlFileName)
{
this.fileName = xmlFileName;
if (!File.Exists(xmlFileName))
{ // 如果XML文档不存在,就创建它
this.Create();
}
}
public string FileName
{
get
{
return fileName;
}
set
{
fileName = value;
}
}
public void Create()
{
xmlDoc = new XmlDocument(); // 创建XML文档
// 加入XML的声明段落,<?xml version="1.0" encoding="gb2321"?>
XmlDeclaration xmlDecl = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
xmlDoc.AppendChild(xmlDecl);
// 加入一个根元素
xmlElement = xmlDoc.CreateElement("", "PersonalTimer", "");
xmlElement.SetAttribute("IsSave", "true");
xmlElement.SetAttribute("IsAutoStart", "true");
xmlElement.SetAttribute("IsTopMost", "true");
xmlElement.SetAttribute("CreatteDate", string.Format("{0}-{1}-{2}", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day));
xmlDoc.AppendChild(xmlElement);
#region 用于表示主窗口的状态
XmlElement xe1 = xmlDoc.CreateElement("MainForm");
// 创建一个节点,用于表示是否显示"计时器"
XmlElement xeStopwatch = xmlDoc.CreateElement("Stopwatch");
xeStopwatch.SetAttribute("Visible", "false"); // 设置该节点的"Visible"属性,"false"(隐藏)或"true"(显示)
xeStopwatch.SetAttribute("State", "Stop"); // 设置该节点的"State"属性,"Started"(已启动)或"Stop"(已停止)
xe1.AppendChild(xeStopwatch);
// 创建一个节点,用于表示所显示时间的信息(如位置及颜色)
XmlElement xeTimer = xmlDoc.CreateElement("Timer");
xeTimer.SetAttribute("ForeColor", "Red"); // 存储字体颜色,
xeTimer.SetAttribute("ForeSize", "2"); // 存储字体大小, 1-小,2-中,3-大
XmlElement xePosition = xmlDoc.CreateElement("Position"); // 存储位置
xePosition.SetAttribute("State", "RightBottom");
xePosition.SetAttribute("X", "0"); // X座标的值
xePosition.SetAttribute("Y", "0"); // Y 座标的值
xeTimer.AppendChild(xePosition);
xe1.AppendChild(xeTimer);
xmlElement.AppendChild(xe1);
#endregion
#region 关于记时器的定时方式及相关的值
// 创建节点,用于表示所设定的定时方式
XmlElement xeSub1 = xmlDoc.CreateElement("StopwatchMode");
xeSub1.SetAttribute("Mode", "Future"); // 设置该节点的"Mode"属性,"Delay"表时延时XX分钟执行,"Future表示将于XX时XX分XX秒很行
// 创建节点,用于储存延时的时间 (如果当TimeMode节点的Mode属性为Delay时才会使用
XmlElement xeChild1 = xmlDoc.CreateElement("DelayMinute");
xeChild1.SetAttribute("Value", "5"); // 设置该节点的"Value"属性,用于储存所延时的分数.
xeSub1.AppendChild(xeChild1);
// 创建节点,用于储存将于XX时XX分XX秒执行的时间
XmlElement xeChild2 = xmlDoc.CreateElement("FutureTime");
xeChild2.SetAttribute("Hour", "23"); // 设置节点的"Hour"属性,用于储存"时"
xeChild2.SetAttribute("Minute", "59"); // 设置节点的"Minute"属性,用于储存"分"
xeChild2.SetAttribute("Second", "59"); // 设置节点的"Second"属性,用于储存"秒"
xeSub1.AppendChild(xeChild2);
xmlElement.AppendChild(xeSub1);
#endregion
#region 操作任务设定
XmlElement xeSub2 = xmlDoc.CreateElement("TaskMode");
xeSub2.SetAttribute("Mode", "Remind"); // 设置节点的"Mode"属性."ShutDown"表示关机,"Logoff"表示注销,"Reboot"表示重新启动,"Remind"表示提醒
// 创建节点,用于储存节点为"提醒"状态时,其提醒的内容
XmlElement xeRemind = xmlDoc.CreateElement("Remind");
xeRemind.SetAttribute("Text", "注意保护眼睛,别太长时间盯着电脑屏幕!"); // 节点的"Text"属性,用于储存提醒的文本内容
xeSub2.AppendChild(xeRemind);
xmlElement.AppendChild(xeSub2);
#endregion
xmlDoc.Save(fileName);
}
/// <summary>
/// 在一父节点中查找指定节点(采用递归法)
/// </summary>
/// <param name="parentNodeName">父节点名</param>
/// <param name="strNodeName">要查找的子节点名</param>
/// <returns>查找到的节点</returns>
private XmlElement getNode(XmlNode parentNode, string strNodeName)
{
XmlElement xeResult = null;
XmlNodeList nodeList = parentNode.ChildNodes; // 获取节点的所有子节点
foreach (XmlNode xn in nodeList)
{
XmlElement xe = (XmlElement)xn;
if (xe.Name == strNodeName)
{
xeResult = xe;
return xeResult;
}
else
{
xeResult = getNode(xn, strNodeName);
}
if (xeResult != null)
{
return xeResult;
}
}
return xeResult; ;
}
/// <summary>
/// 读取节点中属性的值
/// </summary>
/// <param name="strNodeName">节点名</param>
/// <param name="strAttributeName">属性名</param>
/// <returns>返回属性的值</returns>
public string Read(string strNodeName,string strAttributeName)
{
string strResult = null;
xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);
// 获取PersonalTimer节点的所有子节点.
XmlNode rootNode = xmlDoc.SelectSingleNode("PersonalTimer");
if (rootNode.Name == strNodeName)
{
XmlElement xeroot = (XmlElement)rootNode;
return xeroot.GetAttribute(strAttributeName);
}
XmlElement xe = getNode(rootNode, strNodeName);
if (xe == null)
{
throw new Exception("该节点的属性名称不正确或XML文档已损坏");
}
else
{
strResult = xe.GetAttribute(strAttributeName);
}
if (strResult == null)
{
throw new Exception("你输入的节点名称不正确或XML文档已损坏");
}
return strResult;
}
/// <summary>
/// 更新节点中属性的值
/// </summary>
/// <param name="strNodeName">节点名</param>
/// <param name="strAttributeName">属性名</param>
/// <param name="strValue">值</param>
/// <returns>更新完成返回true,否则返回false</returns>
public bool Update(string strNodeName, string strAttributeName, string strValue)
{
bool blResult = false;
xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);
// 获取PersonalTimer节点的所有子节点.
XmlNodeList nodeList = xmlDoc.SelectSingleNode("PersonalTimer").ChildNodes;
XmlNode rootNode = xmlDoc.SelectSingleNode("PersonalTimer");
if (rootNode.Name == strNodeName)
{
XmlElement xeroot = (XmlElement)rootNode;
xeroot.SetAttribute(strAttributeName, strValue);
return true;
}
XmlElement xe = getNode(rootNode, strNodeName);
if (xe.Name == strNodeName)
{
try
{
xe.SetAttribute(strAttributeName, strValue);
xmlDoc.Save(fileName);
blResult = true;
}
catch
{
throw new Exception("该节点的属性名称不正确或XML文档已损坏");
}
}
if (blResult == false)
{
throw new Exception("你输入的节点名称不正确或XML文档已损坏");
}
return blResult;
}
}
}