using System; using System.IO; using System.Linq; using System.Xml; namespace OTSIncAReportApp.Controls { /// /// XML操作类 /// public class XmlOperateUtil { #region 全局变量 string _xmlPath; //文件所在路径 #endregion #region 构造函数 /// /// 初始化一个配置 /// /// 配置所在路径 public XmlOperateUtil(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 } }