

using System; using System.Data; using System.Configuration; using System.Xml; using System.Collections; using System.IO; namespace Common { ////// XML操作: /// 参照手册http://www.w3school.com.cn/xpath/xpath_operators.asp /// public class XMLHelper { #region 构造函数 public XMLHelper(string path) { FilePath = path; OpenXML(); } #endregion #region 对象定义 private XmlDocument xmlDoc = new XmlDocument(); private XmlNode xmlnode; private XmlElement xmlelem; #endregion #region 属性定义 private string errorMess; public string ErrorMess { get { return errorMess; } set { errorMess = value; } } private string filePath; public string FilePath { set { filePath = value; } get { return filePath; } } #endregion #region 创建XML操作对象 /// /// 创建XML操作对象 /// public void OpenXML() { try { if (!string.IsNullOrEmpty(FilePath)) { xmlDoc.Load(filePath); } else { FilePath = string.Format(@"E:\log4net.xml"); //默认路径 xmlDoc.Load(filePath); } } catch (Exception ex) { ErrorMess = ex.Message; } } #endregion #region 创建Xml 文档 /// /// 创建一个带有根节点的Xml 文件 /// /// Xml 文件名称 /// 根节点名称 /// 编码方式:gb2312,UTF-8 等常见的 /// 保存的目录路径 /// public bool CreatexmlDocument(string FileName, string rootName, string Encode) { try { XmlDeclaration xmldecl; xmldecl = xmlDoc.CreateXmlDeclaration("1.0", Encode, null); xmlDoc.AppendChild(xmldecl); xmlelem = xmlDoc.CreateElement("", rootName, ""); xmlDoc.AppendChild(xmlelem); xmlDoc.Save(FileName); return true; } catch (Exception e) { return false; } } #endregion //获取值 #region 得到表 /// /// 得到表 /// /// public DataView GetData() { xmlDoc = new XmlDocument(); DataSet ds = new DataSet(); StringReader read = new StringReader(xmlDoc.SelectSingleNode(FilePath).OuterXml); ds.ReadXml(read); return ds.Tables[0].DefaultView; } #endregion #region 读取指定节点的指定属性值 /// /// 功能: /// 读取指定节点的指定属性值 /// /// 节点名称(相对路径://+节点名称) /// 此节点的属性 /// public string GetXmlNodeValue(string strNode, string strAttribute) { string strReturn = ""; try { //根据指定路径获取节点 XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode); //获取节点的属性,并循环取出需要的属性值 XmlAttributeCollection xmlAttr = xmlNode.Attributes; for (int i = 0; i < xmlAttr.Count; i++) { if (xmlAttr.Item(i).Name == strAttribute) { strReturn = xmlAttr.Item(i).Value; } } } catch (XmlException xmle) { throw xmle; } return strReturn; } #endregion #region 读取指定节点的值 /// /// 功能: /// 读取指定节点的值 /// /// 节点名称 /// public string GetXmlNodeValue(string strNode) { string strReturn = String.Empty; try { //根据路径获取节点 XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode); strReturn = xmlNode.InnerText; } catch (XmlException xmle) { System.Console.WriteLine(xmle.Message); } return strReturn; } #endregion #region 获取XML文件的根元素 /// /// 获取XML文件的根元素 /// public XmlNode GetXmlRoot() { return xmlDoc.DocumentElement; } #endregion #region 获取XML节点值 /// /// 获取XML节点值 /// /// /// public string GetNodeValue(string nodeName) { xmlDoc = new XmlDocument(); xmlDoc.Load(FilePath); XmlNodeList xnl = xmlDoc.ChildNodes; foreach (XmlNode xnf in xnl) { XmlElement xe = (XmlElement) xnf; XmlNodeList xnf1 = xe.ChildNodes; foreach (XmlNode xn2 in xnf1) { if (xn2.InnerText == nodeName) { XmlElement xe2 = (XmlElement) xn2; return xe2.GetAttribute("value"); } } } return null; } #endregion //添加或插入 #region 设置节点值 /// /// 功能: /// 设置节点值 /// /// 节点的名称 /// 节点值 public void SetXmlNodeValue(string xmlNodePath, string xmlNodeValue) { try { //根据指定路径获取节点 XmlNode xmlNode = xmlDoc.SelectSingleNode(xmlNodePath); //设置节点值 xmlNode.InnerText = xmlNodeValue; } catch (XmlException xmle) { throw xmle; } } #endregion #region 添加父节点 /// /// 在根节点下添加父节点 /// public void AddParentNode(string parentNode) { XmlNode root = GetXmlRoot(); XmlNode parentXmlNode = xmlDoc.CreateElement(parentNode); root.AppendChild(parentXmlNode); } #endregion #region 向一个已经存在的父节点中插入一个子节点 /// /// 向一个已经存在的父节点中插入一个子节点 /// public void AddChildNode(string parentNodePath, string childNodePath) { XmlNode parentXmlNode = xmlDoc.SelectSingleNode(parentNodePath); XmlNode childXmlNode = xmlDoc.CreateElement(childNodePath); parentXmlNode.AppendChild(childXmlNode); } #endregion #region 向一个节点添加属性 /// /// 向一个节点添加属性 /// public void AddAttribute(string NodePath, string NodeAttribute) { XmlAttribute nodeAttribute = xmlDoc.CreateAttribute(NodeAttribute); XmlNode nodePath = xmlDoc.SelectSingleNode(NodePath); nodePath.Attributes.Append(nodeAttribute); } #endregion #region 插入一个节点和它的若干子节点 /// /// 插入一个节点和它的若干子节点 /// /// 插入的节点名称 /// 此节点是否具有属性,True 为有,False 为无 /// 此插入节点的父节点 /// 此节点的属性,Key 为属性名,Value 为属性值 /// 子节点的属性, Key 为Name,Value 为InnerText /// 返回真为更新成功,否则失败 public bool InsertNode(string NewNodeName, bool HasAttributes, string fatherNode, Hashtable htAtt, Hashtable htSubNode) { try { xmlDoc.Load(FilePath); XmlNode root = xmlDoc.SelectSingleNode(fatherNode); xmlelem = xmlDoc.CreateElement(NewNodeName); if (htAtt != null && HasAttributes) //若此节点有属性,则先添加属性 { SetAttributes(xmlelem, htAtt); AddNodes(xmlelem.Name, xmlDoc, xmlelem, htSubNode); //添加完此节点属性后,再添加它的子节点和它们的InnerText } else { AddNodes(xmlelem.Name, xmlDoc, xmlelem, htSubNode); //若此节点无属性,那么直接添加它的子节点 } root.AppendChild(xmlelem); xmlDoc.Save(FilePath); return true; } catch (Exception e) { throw new Exception(e.Message); } } #endregion #region 设置节点属性 /// /// 设置节点属性 /// /// 节点所处的Element /// 节点属性,Key 代表属性名称,Value 代表属性值 public void SetAttributes(XmlElement xe, Hashtable htAttribute) { foreach (DictionaryEntry de in htAttribute) { xe.SetAttribute(de.Key.ToString(), de.Value.ToString()); } } #endregion #region 增加子节点到根节点下 /// /// 增加子节点到根节点下 /// /// 上级节点名称 /// Xml 文档 /// 父根节点所属的Element /// 子节点属性,Key 为Name 值,Value 为InnerText 值 public void AddNodes(string rootNode, XmlDocument xmlDoc, XmlElement rootXe, Hashtable SubNodes) { foreach (DictionaryEntry de in SubNodes) { xmlnode = xmlDoc.SelectSingleNode(rootNode); XmlElement subNode = xmlDoc.CreateElement(de.Key.ToString()); subNode.InnerText = de.Value.ToString(); rootXe.AppendChild(subNode); } } #endregion //更新 #region 设置节点的属性值 /// /// 功能: /// 设置节点的属性值 /// /// 节点名称 /// 属性名称 /// 属性值 public void SetXmlNodeValue(string xmlNodePath, string xmlNodeAttribute, string xmlNodeAttributeValue) { try { //根据指定路径获取节点 XmlNode xmlNode = xmlDoc.SelectSingleNode(xmlNodePath); //获取节点的属性,并循环取出需要的属性值 XmlAttributeCollection xmlAttr = xmlNode.Attributes; for (int i = 0; i < xmlAttr.Count; i++) { if (xmlAttr.Item(i).Name == xmlNodeAttribute) { xmlAttr.Item(i).Value = xmlNodeAttributeValue; break; } } } catch (XmlException xmle) { throw xmle; } } #endregion #region 更新节点 /// /// 更新节点 /// /// 需要更新节点的上级节点 /// 需要更新的属性表,Key 代表需要更新的属性,Value 代表更新后的值 /// 需要更新的子节点的属性表,Key 代表需要更新的子节点名字Name,Value 代表更新后的值InnerText /// 返回真为更新成功,否则失败 public bool UpdateNode(string fatherNode, Hashtable htAtt, Hashtable htSubNode) { try { xmlDoc = new XmlDocument(); xmlDoc.Load(FilePath); XmlNodeList root = xmlDoc.SelectSingleNode(fatherNode).ChildNodes; UpdateNodes(root, htAtt, htSubNode); xmlDoc.Save(FilePath); return true; } catch (Exception e) { throw new Exception(e.Message); } } #endregion #region 更新节点属性和子节点InnerText 值 /// /// 更新节点属性和子节点InnerText 值 /// /// 根节点名字 /// 需要更改的属性名称和值 /// 需要更改InnerText 的子节点名字和值 public void UpdateNodes(XmlNodeList root, Hashtable htAtt, Hashtable htSubNode) { foreach (XmlNode xn in root) { xmlelem = (XmlElement) xn; if (xmlelem.HasAttributes) //如果节点如属性,则先更改它的属性 { foreach (DictionaryEntry de in htAtt) //遍历属性哈希表 { if (xmlelem.HasAttribute(de.Key.ToString())) //如果节点有需要更改的属性 { xmlelem.SetAttribute(de.Key.ToString(), de.Value.ToString()); //则把哈希表中相应的值Value 赋给此属性Key } } } if (xmlelem.HasChildNodes) //如果有子节点,则修改其子节点的InnerText { XmlNodeList xnl = xmlelem.ChildNodes; foreach (XmlNode xn1 in xnl) { XmlElement xe = (XmlElement) xn1; foreach (DictionaryEntry de in htSubNode) { if (xe.Name == de.Key.ToString()) //htSubNode 中的key 存储了需要更改的节点名称, { xe.InnerText = de.Value.ToString(); //htSubNode中的Value存储了Key 节点更新后的数据 } } } } } } #endregion //删除 #region 删除一个节点的属性 /// /// 删除一个节点的属性 /// public void DeleteAttribute(string NodePath, string NodeAttribute, string NodeAttributeValue) { XmlNodeList nodePath = xmlDoc.SelectSingleNode(NodePath).ChildNodes; foreach (XmlNode xn in nodePath) { XmlElement xe = (XmlElement) xn; if (xe.GetAttribute(NodeAttribute) == NodeAttributeValue) { xe.RemoveAttribute(NodeAttribute); //删除属性 } } } #endregion #region 删除一个节点 /// /// 删除一个节点 /// public void DeleteXmlNode(string tempXmlNode) { XmlNode xmlNodePath = xmlDoc.SelectSingleNode(tempXmlNode); xmlNodePath.ParentNode.RemoveChild(xmlNodePath); } #endregion #region 删除指定节点下的子节点 /// /// 删除指定节点下的子节点 /// /// 制定节点 /// 返回真为更新成功,否则失败 public bool DeleteNodes(string fatherNode) { try { xmlDoc = new XmlDocument(); xmlDoc.Load(FilePath); xmlnode = xmlDoc.SelectSingleNode(fatherNode); xmlnode.RemoveAll(); xmlDoc.Save(FilePath); return true; } catch (XmlException xe) { throw new XmlException(xe.Message); } } #endregion //内部函数与保存 #region 私有函数 private string functionReturn(XmlNodeList xmlList, int i, string nodeName) { string node = xmlList[i].ToString(); string rusultNode = ""; for (int j = 0; j < i; j++) { if (node == nodeName) { rusultNode = node.ToString(); } else { if (xmlList[j].HasChildNodes) { functionReturn(xmlList, j, nodeName); } else { break; } } } return rusultNode; } #endregion #region 保存XML文件 /// /// 功能: /// 保存XML文件 /// /// public void SavexmlDocument() { try { xmlDoc.Save(FilePath); } catch (XmlException xmle) { throw xmle; } } /// /// 功能: 保存XML文件 /// /// public void SavexmlDocument(string tempXMLFilePath) { try { xmlDoc.Save(tempXMLFilePath); } catch (XmlException xmle) { throw xmle; } } #endregion } }