using System.Xml; /// 这个是用VS2010写的,如果用VS2005,请去掉System.Linq和System.Xml.Linq的引用 /// 可以将此文件直接编译成dll,今后程序只需要引用该dll后开头添加using XmlLibrary;即可。 namespace Common.Helpers { /// /// XMLHelper参数 /// public class XmlParameter { private string _name; private string _innerText; private string _namespaceOfPrefix; private AttributeParameter[] _attributes; public XmlParameter() { } public XmlParameter(string name, params AttributeParameter[] attParas) : this(name, null, null, attParas) { } public XmlParameter(string name, string innerText, params AttributeParameter[] attParas) : this(name, innerText, null, attParas) { } public XmlParameter(string name, string innerText, string namespaceOfPrefix, params AttributeParameter[] attParas) { this._name = name; this._innerText = innerText; this._namespaceOfPrefix = namespaceOfPrefix; this._attributes = attParas; } /// /// 节点名称 /// public string Name { get { return this._name; } set { this._name = value; } } /// /// 节点文本 /// public string InnerText { get { return this._innerText; } set { this._innerText = value; } } /// /// 节点前缀xmlns声明(命名空间URI) /// public string NamespaceOfPrefix { get { return this._namespaceOfPrefix; } set { this._namespaceOfPrefix = value; } } /// /// 节点属性集 /// public AttributeParameter[] Attributes { get { return this._attributes; } set { this._attributes = value; } } } /// /// 节点属性参数 /// public class AttributeParameter { private string _name; private string _value; public AttributeParameter() { } public AttributeParameter(string attributeName, string attributeValue) { this._name = attributeName; this._value = attributeValue; } /// /// 属性名称 /// public string Name { get { return this._name; } set { this._name = value; } } /// /// 属性值 /// public string Value { get { return this._value; } set { this._value = value; } } } public class XMLHelper { private static string _xPath; /// /// xml文件路径 /// public static string XmlPath { get { return _xPath; } set { _xPath = value; } } private static string _configName = "XmlPath"; /// /// 配置文件节点名称,请设置在AppSettings节点下 /// public static string ConfigName { get { return _configName; } set { _configName = value; GetConfig(); } } /// /// 从配置文件读取xml路径 /// static void GetConfig() { //if (string.IsNullOrEmpty(_xPath)) //{ // try // { // _xPath = ConfigurationManager.AppSettings[_configName]; // } // catch { } //} } static XMLHelper() { GetConfig(); } #region private AppendChild /// /// 添加一个子节点 /// /// XmlDocument对象 /// 父节点 /// Xml参数 private static void AppendChild(XmlDocument xDoc, XmlNode parentNode, params XmlParameter[] xlParameter) { foreach (XmlParameter xpar in xlParameter) { XmlNode newNode = xDoc.CreateNode(XmlNodeType.Element, xpar.Name, null); string ns = string.IsNullOrEmpty(xpar.NamespaceOfPrefix) ? "" : newNode.GetNamespaceOfPrefix(xpar.NamespaceOfPrefix); foreach (AttributeParameter attp in xpar.Attributes) { XmlNode attr = xDoc.CreateNode(XmlNodeType.Attribute, attp.Name, ns == "" ? null : ns); attr.Value = attp.Value; newNode.Attributes.SetNamedItem(attr); } newNode.InnerText = xpar.InnerText; parentNode.AppendChild(newNode); } } #endregion #region private AddEveryNode private static void AddEveryNode(XmlDocument xDoc, XmlNode parentNode, params XmlParameter[] paras) { XmlNodeList nlst = xDoc.DocumentElement.ChildNodes; foreach (XmlNode xns in nlst) { if (xns.Name == parentNode.Name) { AppendChild(xDoc, xns, paras); } else { foreach (XmlNode xn in xns) { if (xn.Name == parentNode.Name) { AppendChild(xDoc, xn, paras); } } } } } #endregion #region private GetXmlDom /// /// 获得一个XmlDocument对象 /// /// private static XmlDocument GetXmlDom() { XmlDocument xdoc = new XmlDocument(); xdoc.Load(_xPath); return xdoc; } #endregion #region CreateXmlFile /// /// 创建一个XML文档,成功创建后操作路径将直接指向该文件 /// /// 文件物理路径名 /// 根结点名称 /// 元素节点名称 /// XML参数 public static void CreateXmlFile(string fileName, string rootNode, string elementName, params XmlParameter[] xmlParameter) { XmlDocument xDoc = new XmlDocument(); XmlNode xn = xDoc.CreateXmlDeclaration("1.0", "UTF-8", null); xDoc.AppendChild(xn); XmlNode root = xDoc.CreateElement(rootNode); xDoc.AppendChild(root); XmlNode ln = xDoc.CreateNode(XmlNodeType.Element, elementName, null); AppendChild(xDoc, ln, xmlParameter); root.AppendChild(ln); try { xDoc.Save(fileName); _xPath = fileName; } catch { throw; } } /// /// 创建一个XML文档,成功创建后操作路径将直接指向该文件 /// /// 文件物理路径名 /// xml字符串 public static void CreateXmlFile(string fileName, string xmlString) { XmlDocument xDoc = new XmlDocument(); try { xDoc.LoadXml(xmlString); xDoc.Save(fileName); _xPath = fileName; } catch { throw; } } #endregion #region AddNewNode /// /// 添加新节点 /// /// 新节点的父节点对象 /// Xml参数对象 public static void AddNewNode(XmlNode parentNode, params XmlParameter[] xmlParameter) { XmlDocument xDoc = GetXmlDom(); if (parentNode.Name == xDoc.DocumentElement.Name) { XmlNode newNode = xDoc.CreateNode(XmlNodeType.Element, xDoc.DocumentElement.ChildNodes[0].Name, null); AppendChild(xDoc, newNode, xmlParameter); xDoc.DocumentElement.AppendChild(newNode); } else { AddEveryNode(xDoc, parentNode, xmlParameter); } xDoc.Save(_xPath); } /// /// 添加新节点 /// /// XmlDocument对象 /// 新节点的父节点名称 /// XML参数对象 public static void AddNewNode(string parentName, params XmlParameter[] xmlParameter) { XmlDocument xDoc = GetXmlDom(); XmlNode parentNode = GetNode(xDoc, parentName); if (parentNode == null) return; if (parentNode.Name == xDoc.DocumentElement.Name) { XmlNode newNode = xDoc.CreateNode(XmlNodeType.Element, xDoc.DocumentElement.ChildNodes[0].Name, null); AppendChild(xDoc, newNode, xmlParameter); xDoc.DocumentElement.AppendChild(newNode); } else { AddEveryNode(xDoc, parentNode, xmlParameter); } xDoc.Save(_xPath); } #endregion #region AddAttribute /// /// 添加节点属性 /// /// 节点对象 /// 该节点的命名空间URI /// 新属性名称 /// 属性值 public static void AddAttribute(XmlNode node, string namespaceOfPrefix, string attributeName, string attributeValue) { XmlDocument xDoc = GetXmlDom(); string ns = string.IsNullOrEmpty(namespaceOfPrefix) ? "" : node.GetNamespaceOfPrefix(namespaceOfPrefix); XmlNode xn = xDoc.CreateNode(XmlNodeType.Attribute, attributeName, ns == "" ? null : ns); xn.Value = attributeValue; node.Attributes.SetNamedItem(xn); xDoc.Save(_xPath); } /// /// 添加节点属性 /// /// 节点对象 /// 该节点的命名空间URI /// 节点属性参数 public static void AddAttribute(XmlNode node, string namespaceOfPrefix, params AttributeParameter[] attributeParameters) { XmlDocument xDoc = GetXmlDom(); string ns = string.IsNullOrEmpty(namespaceOfPrefix) ? "" : node.GetNamespaceOfPrefix(namespaceOfPrefix); foreach (AttributeParameter attp in attributeParameters) { XmlNode xn = xDoc.CreateNode(XmlNodeType.Attribute, attp.Name, ns == "" ? null : ns); xn.Value = attp.Value; node.Attributes.SetNamedItem(xn); } xDoc.Save(_xPath); } /// /// 添加节点属性 /// /// 节点名称 /// 该节点的命名空间URI /// 新属性名称 /// 属性值 public static void AddAttribute(string nodeName, string namespaceOfPrefix, string attributeName, string attributeValue) { XmlDocument xDoc = GetXmlDom(); XmlNodeList xlst = xDoc.DocumentElement.ChildNodes; for (int i = 0; i < xlst.Count; i++) { XmlNode node = GetNode(xlst[i], nodeName); if (node == null) break; AddAttribute(node, namespaceOfPrefix, attributeName, attributeValue); } xDoc.Save(_xPath); } /// /// 添加节点属性 /// /// 节点名称 /// 该节点的命名空间URI /// 节点属性参数 public static void AddAttribute(string nodeName, string namespaceOfPrefix, params AttributeParameter[] attributeParameters) { XmlDocument xDoc = GetXmlDom(); XmlNodeList xlst = xDoc.DocumentElement.ChildNodes; for (int i = 0; i < xlst.Count; i++) { XmlNode node = GetNode(xlst[i], nodeName); if (node == null) break; AddAttribute(node, namespaceOfPrefix, attributeParameters); } xDoc.Save(_xPath); } #endregion #region GetNode /// /// 获取指定节点名称的节点对象 /// /// 节点名称 /// public static XmlNode GetNode(string nodeName) { XmlDocument xDoc = GetXmlDom(); if (xDoc.DocumentElement.Name == nodeName) return xDoc.DocumentElement; XmlNodeList nlst = xDoc.DocumentElement.ChildNodes; foreach (XmlNode xns in nlst) // 遍历所有子节点 { if (xns.Name == nodeName) return xns; else { XmlNode xn = GetNode(xns, nodeName); if (xn != null) return xn; /// V1.0.0.3添加节点判断 } } return null; } /// /// 获取指定节点名称的节点对象 /// /// 节点对象 /// 节点名称 /// public static XmlNode GetNode(XmlNode node, string nodeName) { foreach (XmlNode xn in node) { if (xn.Name == nodeName) return xn; else { XmlNode tmp = GetNode(xn, nodeName); if (tmp != null) return tmp; } } return null; } /// /// 获取指定节点名称的节点对象 /// /// 节点索引 /// 节点名称 public static XmlNode GetNode(int index, string nodeName) { XmlDocument xDoc = GetXmlDom(); XmlNodeList nlst = xDoc.DocumentElement.ChildNodes; if (nlst.Count <= index) return null; if (nlst[index].Name == nodeName) return nlst[index]; foreach (XmlNode xn in nlst[index]) { return GetNode(xn, nodeName); } return null; } /// /// 获取指定节点名称的节点对象 /// /// 节点对象 /// 节点名称 /// 节点内容 public static XmlNode GetNode(XmlNode node, string nodeName, string innerText) { foreach (XmlNode xn in node) { if (xn.Name == nodeName && xn.InnerText == innerText) return xn; else { XmlNode tmp = GetNode(xn, nodeName, innerText); if (tmp != null) return tmp; } } return null; } /// /// 获取指定节点名称的节点对象 /// /// 节点名称 /// 节点内容 public static XmlNode GetNode(string nodeName, string innerText) { XmlDocument xDoc = GetXmlDom(); XmlNodeList nlst = xDoc.DocumentElement.ChildNodes; foreach (XmlNode xns in nlst) // 遍历所有子节点 { if (xns.Name == nodeName && xns.InnerText == innerText) return xns; XmlNode tmp = GetNode(xns, nodeName, innerText); if (tmp != null) return tmp; } return null; } /// /// 获取指定节点名称的节点对象 /// /// XML参数 public static XmlNode GetNode(XmlParameter xmlParameter) { return GetNode(xmlParameter.Name, xmlParameter.InnerText); } /// /// 获取指定节点名称的节点对象 /// /// 节点对象 /// XML参数 public static XmlNode GetNode(XmlNode node, XmlParameter xmlParameter) { return GetNode(node, xmlParameter.Name, node.InnerText); } #endregion #region UpdateNode private static void UpdateNode(XmlNode node, XmlParameter xmlParameter) { node.InnerText = xmlParameter.InnerText; for (int i = 0; i < xmlParameter.Attributes.Length; i++) { for (int j = 0; j < node.Attributes.Count; j++) { if (node.Attributes[j].Name == xmlParameter.Attributes[i].Name) { node.Attributes[j].Value = xmlParameter.Attributes[i].Value; } } } } private static void UpdateNode(XmlNode node, string innerText, AttributeParameter[] attributeParameters) { node.InnerText = innerText; for (int i = 0; i < attributeParameters.Length; i++) { for (int j = 0; j < node.Attributes.Count; j++) { if (node.Attributes[j].Name == attributeParameters[i].Name) { node.Attributes[j].Value = attributeParameters[i].Value; } } } } /// /// 修改节点的内容 /// /// 节点索引 /// XML参数对象 public static void UpdateNode(int index, XmlParameter xmlParameter) { XmlDocument xDoc = GetXmlDom(); XmlNodeList nlst = xDoc.DocumentElement.ChildNodes; if (nlst.Count <= index) return; if (nlst[index].Name == xmlParameter.Name) { UpdateNode(nlst[index], xmlParameter); } else { foreach (XmlNode xn in nlst[index]) { XmlNode xnd = GetNode(xn, xmlParameter.Name); if (xnd != null) { UpdateNode(xnd, xmlParameter); } } } xDoc.Save(_xPath); } /// /// 修改节点的内容 /// /// 节点索引 /// 节点名称 /// 修改后的内容 public static void UpdateNode(int index, string nodeName, string newInnerText) { XmlDocument xDoc = GetXmlDom(); XmlNodeList nlst = xDoc.DocumentElement.ChildNodes; if (nlst.Count <= index) return; if (nlst[index].Name == nodeName) { nlst[index].InnerText = newInnerText; } else { foreach (XmlNode xn in nlst[index]) { XmlNode xnd = GetNode(xn, nodeName); if (xnd != null) { xnd.InnerText = newInnerText; } } } xDoc.Save(_xPath); } /// /// 修改节点的内容 /// /// XmlParameter对象 /// 修改后的内容 /// 需要修改的属性 public static void UpdateNode(XmlParameter xmlParameter, string innerText, params AttributeParameter[] attributeParameters) { XmlDocument xDoc = GetXmlDom(); XmlNodeList nlst = xDoc.DocumentElement.ChildNodes; foreach (XmlNode xns in nlst) // 遍历所有子节点 { if (xns.Name == xmlParameter.Name && xns.InnerText == xmlParameter.InnerText) { UpdateNode(xns, innerText, attributeParameters); break; } XmlNode tmp = GetNode(xns, xmlParameter); if (tmp != null) { UpdateNode(tmp, innerText, attributeParameters); break; } } xDoc.Save(_xPath); } #endregion #region DeleteNode /// /// 删除节点 /// /// 节点索引 public static void DeleteNode(int index) { XmlDocument xDoc = GetXmlDom(); XmlNodeList nlst = xDoc.DocumentElement.ChildNodes; nlst[index].ParentNode.RemoveChild(nlst[index]); xDoc.Save(_xPath); } /// /// 删除节点 /// /// 需要删除的节点对象 public static void DeleteNode(params XmlNode[] nodeList) { XmlDocument xDoc = GetXmlDom(); foreach (XmlNode xnl in nodeList) { foreach (XmlNode xn in xDoc.DocumentElement.ChildNodes) { if (xnl.Equals(xn)) { xn.ParentNode.RemoveChild(xn); break; } } } xDoc.Save(_xPath); } /// /// 删除节点 /// /// XmlDocument对象 /// 节点名称 /// 节点内容 public static void DeleteNode(string nodeName, string nodeText) { XmlDocument xDoc = GetXmlDom(); foreach (XmlNode xn in xDoc.DocumentElement.ChildNodes) { if (xn.Name == nodeName) { if (xn.InnerText == nodeText) { xn.ParentNode.RemoveChild(xn); return; } } else { XmlNode node = GetNode(xn, nodeName); if (node != null && node.InnerText == nodeText) { node.ParentNode.ParentNode.RemoveChild(node.ParentNode); return; } } } xDoc.Save(_xPath); } #endregion #region SetAttribute /// /// 修改属性值 /// /// 元素对象 /// 属性参数 private static void SetAttribute(XmlElement elem, params AttributeParameter[] attps) { foreach (AttributeParameter attp in attps) { elem.SetAttribute(attp.Name, attp.Value); } } /// /// 修改属性值 /// /// XML参数 /// 属性参数 public static void SetAttribute(XmlParameter xmlParameter, params AttributeParameter[] attributeParameters) { XmlDocument xDoc = GetXmlDom(); XmlNodeList nlst = xDoc.DocumentElement.ChildNodes; foreach (XmlNode xns in nlst) // 遍历所有子节点 { if (xns.Name == xmlParameter.Name && xns.InnerText == xmlParameter.InnerText) { SetAttribute((XmlElement)xns, attributeParameters); break; } XmlNode tmp = GetNode(xns, xmlParameter); if (tmp != null) { SetAttribute((XmlElement)tmp, attributeParameters); break; } } xDoc.Save(_xPath); } /// /// 修改属性值 /// /// XML参数 /// 新属性值 public static void SetAttribute(XmlParameter xmlParameter, string attributeName, string attributeValue) { XmlDocument xDoc = GetXmlDom(); XmlNodeList nlst = xDoc.DocumentElement.ChildNodes; foreach (XmlNode xns in nlst) // 遍历所有子节点 { if (xns.Name == xmlParameter.Name && xns.InnerText == xmlParameter.InnerText) { ((XmlElement)xns).SetAttribute(attributeName, attributeValue); break; } XmlNode tmp = GetNode(xns, xmlParameter); if (tmp != null) { ((XmlElement)tmp).SetAttribute(attributeName, attributeValue); break; } } xDoc.Save(_xPath); } #endregion } }