using System;
using System.IO;
using System.Linq;
using System.Xml;
namespace OTSIncAReportApp.Controls
{
///
/// XML操作类
///
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 void SetAttribute(string AttributeName, string AttributeValue, 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);
XmlElement element = (XmlElement)xmlDoc.SelectSingleNode(xpath);
if (element == null) //新增节点
{
element = (XmlElement)makeXPath(xmlDoc, xmlRoot, xpath);
}
//设置节点上属性的值
element.SetAttribute(AttributeName, AttributeValue);
//保存
xmlDoc.Save(_xmlPath);
}
public string GetAttribute(string AttributeName, 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);
XmlElement element = (XmlElement)xmlDoc.SelectSingleNode(xpath);
if (element == null) //新增节点
{
element = (XmlElement)makeXPath(xmlDoc, xmlRoot, xpath);
}
//设置节点上属性的值
string retstr = element.GetAttribute(AttributeName);
//保存
xmlDoc.Save(_xmlPath);
return retstr;
}
///
/// 读取配置
///
/// 节点
///
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;
}
///
/// 删除节点
///
///
public void RemoveNode(params string[] nodes)
{
XmlDocument xmlDoc = new XmlDocument();
if (File.Exists(_xmlPath) == false)
return;
else
xmlDoc.Load(_xmlPath);
string xpath = string.Join("/", nodes);
XmlNode node = xmlDoc.SelectSingleNode("/XmlConfig/" + xpath);
//取得父节点
string[] father_nodes = new string[nodes.Count() - 1];
//对父节点进行初始化
for (int i = 0; i < nodes.Count() - 1; i++)
{
father_nodes[i] = (string)nodes[i].Clone();
}
string fast_xpath = string.Join("/", father_nodes);
XmlNode fastnode = xmlDoc.SelectSingleNode("/XmlConfig/" + fast_xpath);
if (node == null)
return;
if (fastnode == null)
return;
//使用父节点删除子节点
fastnode.RemoveChild(node);
//保存
xmlDoc.Save(_xmlPath);
}
#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
}
}