You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

713 lines
26 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Xml;
/// 这个是用VS2010写的如果用VS2005请去掉System.Linq和System.Xml.Linq的引用
/// 可以将此文件直接编译成dll今后程序只需要引用该dll后开头添加using XmlLibrary;即可。
namespace Common.Helpers
{
/// <summary>
/// XMLHelper参数
/// </summary>
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;
}
/// <summary>
/// 节点名称
/// </summary>
public string Name
{
get { return this._name; }
set { this._name = value; }
}
/// <summary>
/// 节点文本
/// </summary>
public string InnerText
{
get { return this._innerText; }
set { this._innerText = value; }
}
/// <summary>
/// 节点前缀xmlns声明(命名空间URI)
/// </summary>
public string NamespaceOfPrefix
{
get { return this._namespaceOfPrefix; }
set { this._namespaceOfPrefix = value; }
}
/// <summary>
/// 节点属性集
/// </summary>
public AttributeParameter[] Attributes
{
get { return this._attributes; }
set { this._attributes = value; }
}
}
/// <summary>
/// 节点属性参数
/// </summary>
public class AttributeParameter
{
private string _name;
private string _value;
public AttributeParameter() { }
public AttributeParameter(string attributeName, string attributeValue)
{
this._name = attributeName;
this._value = attributeValue;
}
/// <summary>
/// 属性名称
/// </summary>
public string Name
{
get { return this._name; }
set { this._name = value; }
}
/// <summary>
/// 属性值
/// </summary>
public string Value
{
get { return this._value; }
set { this._value = value; }
}
}
public class XMLHelper
{
private static string _xPath;
/// <summary>
/// xml文件路径
/// </summary>
public static string XmlPath
{
get { return _xPath; }
set { _xPath = value; }
}
private static string _configName = "XmlPath";
/// <summary>
/// 配置文件节点名称请设置在AppSettings节点下
/// </summary>
public static string ConfigName
{
get { return _configName; }
set { _configName = value; GetConfig(); }
}
/// <summary>
/// 从配置文件读取xml路径
/// </summary>
static void GetConfig()
{
//if (string.IsNullOrEmpty(_xPath))
//{
// try
// {
// _xPath = ConfigurationManager.AppSettings[_configName];
// }
// catch { }
//}
}
static XMLHelper() { GetConfig(); }
#region private AppendChild
/// <summary>
/// 添加一个子节点
/// </summary>
/// <param name="xDoc">XmlDocument对象</param>
/// <param name="parentNode">父节点</param>
/// <param name="xlParameter">Xml参数</param>
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
/// <summary>
/// 获得一个XmlDocument对象
/// </summary>
/// <returns></returns>
private static XmlDocument GetXmlDom()
{
XmlDocument xdoc = new XmlDocument();
xdoc.Load(_xPath);
return xdoc;
}
#endregion
#region CreateXmlFile
/// <summary>
/// 创建一个XML文档成功创建后操作路径将直接指向该文件
/// </summary>
/// <param name="fileName">文件物理路径名</param>
/// <param name="rootNode">根结点名称</param>
/// <param name="elementName">元素节点名称</param>
/// <param name="xmlParameter">XML参数</param>
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;
}
}
/// <summary>
/// 创建一个XML文档成功创建后操作路径将直接指向该文件
/// </summary>
/// <param name="fileName">文件物理路径名</param>
/// <param name="xmlString">xml字符串</param>
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
/// <summary>
/// 添加新节点
/// </summary>
/// <param name="parentNode">新节点的父节点对象</param>
/// <param name="xmlParameter">Xml参数对象</param>
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);
}
/// <summary>
/// 添加新节点
/// </summary>
/// <param name="xDoc">XmlDocument对象</param>
/// <param name="parentName">新节点的父节点名称</param>
/// <param name="xmlParameter">XML参数对象</param>
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
/// <summary>
/// 添加节点属性
/// </summary>
/// <param name="node">节点对象</param>
/// <param name="namespaceOfPrefix">该节点的命名空间URI</param>
/// <param name="attributeName">新属性名称</param>
/// <param name="attributeValue">属性值</param>
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);
}
/// <summary>
/// 添加节点属性
/// </summary>
/// <param name="node">节点对象</param>
/// <param name="namespaceOfPrefix">该节点的命名空间URI</param>
/// <param name="attributeParameters">节点属性参数</param>
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);
}
/// <summary>
/// 添加节点属性
/// </summary>
/// <param name="nodeName">节点名称</param>
/// <param name="namespaceOfPrefix">该节点的命名空间URI</param>
/// <param name="attributeName">新属性名称</param>
/// <param name="attributeValue">属性值</param>
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);
}
/// <summary>
/// 添加节点属性
/// </summary>
/// <param name="nodeName">节点名称</param>
/// <param name="namespaceOfPrefix">该节点的命名空间URI</param>
/// <param name="attributeParameters">节点属性参数</param>
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
/// <summary>
/// 获取指定节点名称的节点对象
/// </summary>
/// <param name="nodeName">节点名称</param>
/// <returns></returns>
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;
}
/// <summary>
/// 获取指定节点名称的节点对象
/// </summary>
/// <param name="node">节点对象</param>
/// <param name="nodeName">节点名称</param>
/// <returns></returns>
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;
}
/// <summary>
/// 获取指定节点名称的节点对象
/// </summary>
/// <param name="index">节点索引</param>
/// <param name="nodeName">节点名称</param>
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;
}
/// <summary>
/// 获取指定节点名称的节点对象
/// </summary>
/// <param name="node">节点对象</param>
/// <param name="nodeName">节点名称</param>
/// <param name="innerText">节点内容</param>
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;
}
/// <summary>
/// 获取指定节点名称的节点对象
/// </summary>
/// <param name="nodeName">节点名称</param>
/// <param name="innerText">节点内容</param>
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;
}
/// <summary>
/// 获取指定节点名称的节点对象
/// </summary>
/// <param name="xmlParameter">XML参数</param>
public static XmlNode GetNode(XmlParameter xmlParameter)
{
return GetNode(xmlParameter.Name, xmlParameter.InnerText);
}
/// <summary>
/// 获取指定节点名称的节点对象
/// </summary>
/// <param name="node">节点对象</param>
/// <param name="xmlParameter">XML参数</param>
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;
}
}
}
}
/// <summary>
/// 修改节点的内容
/// </summary>
/// <param name="index">节点索引</param>
/// <param name="xmlParameter">XML参数对象</param>
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);
}
/// <summary>
/// 修改节点的内容
/// </summary>
/// <param name="index">节点索引</param>
/// <param name="nodeName">节点名称</param>
/// <param name="newInnerText">修改后的内容</param>
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);
}
/// <summary>
/// 修改节点的内容
/// </summary>
/// <param name="xmlParameter">XmlParameter对象</param>
/// <param name="innerText">修改后的内容</param>
/// <param name="attributeParameters">需要修改的属性</param>
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
/// <summary>
/// 删除节点
/// </summary>
/// <param name="index">节点索引</param>
public static void DeleteNode(int index)
{
XmlDocument xDoc = GetXmlDom();
XmlNodeList nlst = xDoc.DocumentElement.ChildNodes;
nlst[index].ParentNode.RemoveChild(nlst[index]);
xDoc.Save(_xPath);
}
/// <summary>
/// 删除节点
/// </summary>
/// <param name="nodeList">需要删除的节点对象</param>
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);
}
/// <summary>
/// 删除节点
/// </summary>
/// <param name="xDoc">XmlDocument对象</param>
/// <param name="nodeName">节点名称</param>
/// <param name="nodeText">节点内容</param>
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
/// <summary>
/// 修改属性值
/// </summary>
/// <param name="elem">元素对象</param>
/// <param name="attps">属性参数</param>
private static void SetAttribute(XmlElement elem, params AttributeParameter[] attps)
{
foreach (AttributeParameter attp in attps)
{
elem.SetAttribute(attp.Name, attp.Value);
}
}
/// <summary>
/// 修改属性值
/// </summary>
/// <param name="xmlParameter">XML参数</param>
/// <param name="attributeParameters">属性参数</param>
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);
}
/// <summary>
/// 修改属性值
/// </summary>
/// <param name="xmlParameter">XML参数</param>
/// <param name="attributeValue">新属性值</param>
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
}
}