/// <summary>
/// XML文件工具类
/// </summary>
public class XmlFileTool
{
#region 初始化
//根目录名称
public static string ROOTNAME = "/PitCoXmlRoot/";
//XML文件路径
protected string XmlPath;
//XML文件rooe节点
protected string RootName;
// XML读取类
protected XmlDocument objXmlDoc = new XmlDocument();
/// <summary>
/// 初始化
/// </summary>
/// <param name="strXmlPath"></param>
/// <param name="strXmlRootName"></param>
public XmlFileTool(string strXmlPath,string strXmlRootName)
{
this.XmlPath = strXmlPath;
if (!strXmlRootName.EndsWith("/"))
{
strXmlRootName += "/";
}
if (!strXmlRootName.StartsWith("/"))
{
strXmlRootName = "/" + strXmlRootName;
}
this.RootName = strXmlRootName;
}
/// <summary>
/// 初始化
/// </summary>
/// <param name="strXmlPath"></param>
/// <param name="strXmlRootName"></param>
public XmlFileTool(string strXmlPath)
{
this.XmlPath = strXmlPath;
this.RootName = ROOTNAME;
}
#endregion
#region 常用方法
#region 读取方法(单个key)
/// <summary>
/// 根据大类节点名称、小类节点名称获取指定key的Value值
/// </summary>
/// <param name="nodeName">大类节点名称</param>
/// <param name="subNodeName">小类节点名称</param>
/// <param name="key">key值</param>
/// <returns></returns>
public string GetValueByKeyValue(string nodeName, string subNodeName, string key)
{
return GetValueByKeyTag(nodeName, subNodeName, key,"Value");
}
/// <summary>
/// 根据大类节点名称、小类节点名称获取指定key指定TagText的值
/// </summary>
/// <param name="nodeName">大类节点名称</param>
/// <param name="subNodeName">小类节点名称</param>
/// <param name="key">key值</param>
/// <param name="tagTextName">XML中指定属性对应的值</param>
/// <returns></returns>
public string GetValueByKeyTag(string nodeName, string subNodeName, string key, string tagTextName)
{
string returnVlaue = "";
//初始化XML文档
XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings()
{
IgnoreComments = true//忽略文档里面的注释
};
XmlReader reader = XmlReader.Create(XmlPath, settings);
xmlDoc.Load(reader);
XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement
string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", key);
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath); //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
if (null != selectXe)
{
returnVlaue = selectXe.GetAttribute(tagTextName);
//XmlNodeList nodeLst = selectXe.GetElementsByTagName(tagTextName);
//{
// if (nodeLst.Count > 0 && null != nodeLst.Item(0))
// {
// returnVlaue = nodeLst.Item(0).InnerText;
// }
//}
}
//读取完成以后就关闭
reader.Close();
return returnVlaue;
}
/// <summary>
/// 根据大类节点名称、小类节点名称获取指定key指定TagText的值
/// </summary>
/// <param name="nodeName">大类节点名称</param>
/// <param name="subNodeName">小类节点名称</param>
/// <param name="key">key值</param>
/// <param name="tagTextName">XML中指定属性对应的值</param>
/// <returns></returns>
public Dictionary<string, string> GetValueByKeyTagLst(string nodeName, string subNodeName, string typeId, List<string> tagTextNameLst)
{
//初始化XML文档
XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings()
{
IgnoreComments = true//忽略文档里面的注释
};
XmlReader reader = XmlReader.Create(XmlPath, settings);
xmlDoc.Load(reader);
XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement
string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", typeId);
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath); //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
Dictionary<string, string> dic = new Dictionary<string, string>();
if (null != selectXe)
{
foreach (var attr in tagTextNameLst)
{
dic[attr] = selectXe.GetAttribute(attr);
//XmlNodeList nodeLst = selectXe.GetElementsByTagName(attr);
//{
// if (nodeLst.Count > 0 && null != nodeLst.Item(0))
// {
// dic[attr] = nodeLst.Item(0).InnerText;
// }
//}
}
}
//读取完成以后就关闭
reader.Close();
return dic;
}
/// <summary>
/// 获得指定节点下所有标签及值
/// </summary>
/// <param name="nodeName">大类节点名称</param>
/// <param name="subNodeName">小类节点名称</param>
/// <param name="key">key值</param>
/// <returns>未找到节点则返回null</returns>
public Dictionary<string, string> GetAllValueOfNode(string nodeName, string subNodeName, string key)
{
//初始化XML文档
XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings()
{
IgnoreComments = true//忽略文档里面的注释
};
XmlReader reader = XmlReader.Create(XmlPath, settings);
xmlDoc.Load(reader);
//读取完成以后就关闭
reader.Close();
XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement
string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", key);
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);
if (selectXe != null)
{
Dictionary<string, string> retDic = new Dictionary<string, string>();
foreach (XmlNode node in selectXe.ChildNodes)
{
retDic.Add(node.Name, node.InnerText);
}
return retDic;
}
else
return null;//未找到节点则返回null
}
/// <summary>
/// 获取某个节点下的所有节点的key以及对应的value
/// </summary>
/// <param name="nodeName"></param>
/// <param name="subNodeName"></param>
/// <returns></returns>
public Dictionary<string, string> GetAllValueOfNode(string nodeName, string subNodeName)
{
//初始化XML文档
XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings()
{
IgnoreComments = true//忽略文档里面的注释
};
XmlReader reader = XmlReader.Create(XmlPath, settings);
xmlDoc.Load(reader);
//读取完成以后就关闭
reader.Close();
XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement
string strPath = string.Format(RootName + nodeName + "/" + subNodeName);
XmlNodeList selectXe = xe.SelectNodes(strPath);
if (selectXe != null && selectXe.Count > 0)
{
Dictionary<string, string> retDic = new Dictionary<string, string>();
foreach (XmlElement xElement in selectXe)
{
retDic.Add(xElement.GetAttribute("Key"), xElement.GetAttribute("Value"));
}
return retDic;
}
else
return null;//未找到节点则返回null
}
#endregion
#region 读取方法(多个key)
/// <summary>
/// 根据大类节点名称、小类节点名称获取多个key的Value值
/// </summary>
/// <param name="nodeName">大类节点名称</param>
/// <param name="subNodeName">小类节点名称</param>
/// <param name="keyLst">类型详细ID</param>
/// <returns></returns>
public Dictionary<string, string> GetValueByKeyLst(string nodeName, string subNodeName, List<string> keyLst)
{
Dictionary<string, string> returnDic = new Dictionary<string, string>();
//初始化XML文档
XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings()
{
IgnoreComments = true//忽略文档里面的注释
};
XmlReader reader = XmlReader.Create(XmlPath, settings);
xmlDoc.Load(reader);
XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement
//循环处理
foreach (string key in keyLst)
{
string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", key);
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);
//selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
if (null != selectXe)
{
returnDic.Add(key, selectXe.GetAttribute("Value"));
//XmlNodeList nodeLst = selectXe.GetElementsByTagName("Value");
//{
// if (nodeLst.Count > 0 && null != nodeLst.Item(0))
// {
// returnDic.Add(key, nodeLst.Item(0).InnerText);
// }
//}
}
}
//读取完成以后就关闭
reader.Close();
return returnDic;
}
/// <summary>
/// 根据大类节点名称、小类节点名称获取多个key的Value值
/// </summary>
/// <param name="nodeName">大类节点名称</param>
/// <param name="subNodeName">小类节点名称</param>
/// <param name="keyLst">类型详细ID</param>
/// <returns></returns>
public Dictionary<string, string> GetValueByKeyLst(string nodeName, string subNodeName, List<string> keyLst, string tagTextName)
{
Dictionary<string, string> returnDic = new Dictionary<string, string>();
//初始化XML文档
XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings()
{
IgnoreComments = true//忽略文档里面的注释
};
XmlReader reader = XmlReader.Create(XmlPath, settings);
xmlDoc.Load(reader);
XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement
//循环处理
foreach (string key in keyLst)
{
string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", key);
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);
//selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
if (null != selectXe)
{
returnDic.Add(key, selectXe.GetAttribute(tagTextName));
//XmlNodeList nodeLst = selectXe.GetElementsByTagName(tagTextName);
//{
// if (nodeLst.Count > 0 && null != nodeLst.Item(0))
// {
// returnDic.Add(key, nodeLst.Item(0).InnerText);
// }
//}
}
}
//读取完成以后就关闭
reader.Close();
return returnDic;
}
/// <summary>
/// 根据大类节点名称、小类节点名称获取多个key的Value值
/// </summary>
/// <param name="nodeName">大类节点名称</param>
/// <param name="subNodeName">小类节点名称</param>
/// <param name="keyLst">类型详细ID</param>
/// <returns></returns>
public Dictionary<string, Dictionary<string, string>> GetValueByKeyTagLst(string nodeName, string subNodeName, List<string> keyLst, List<string> tagTextNameLst)
{
Dictionary<string, Dictionary<string, string>> returnDic = new Dictionary<string, Dictionary<string, string>>();
//初始化XML文档
XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings()
{
IgnoreComments = true//忽略文档里面的注释
};
XmlReader reader = XmlReader.Create(XmlPath, settings);
xmlDoc.Load(reader);
XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement
//循环处理
foreach (string key in keyLst)
{
string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", key);
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);
//selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
if (null != selectXe)
{
Dictionary<string, string> dicValue = new Dictionary<string, string>();
foreach (var attr in tagTextNameLst)
{
dicValue[attr] = selectXe.GetAttribute(attr);
//XmlNodeList nodeLst = selectXe.GetElementsByTagName(attr);
//{
// if (nodeLst.Count > 0 && null != nodeLst.Item(0))
// {
// dicValue[attr] = nodeLst.Item(0).InnerText;
// }
//}
}
returnDic[key] = dicValue;
}
}
//读取完成以后就关闭
reader.Close();
return returnDic;
}
#endregion
#region 保存数据
/// <summary>
/// 根据节点ID和Key修改具体值
/// </summary>
/// <param name="nodeName">大类节点名称</param>
/// <param name="subNodeName">小类节点名称</param>
/// <param name="typeId">类型详细ID</param>
/// <param name="updValue">修改值</param>
public void SaveValueByKey(string nodeName, string subNodeName, string key, string updValue)
{
//初始化XML文档
XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings()
{
IgnoreComments = true//忽略文档里面的注释
};
XmlReader reader = XmlReader.Create(XmlPath, settings);
xmlDoc.Load(reader);
XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement
string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", key);
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath); //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
if (null != selectXe)
{
//修改值
selectXe.SetAttribute("Value", updValue);
//读取完成以后就关闭
reader.Close();
xmlDoc.Save(XmlPath);
}
else
{
//读取完成以后就关闭
reader.Close();
//没有找到的场合,进行新增
InsertValueByKey(nodeName, subNodeName, key, updValue);
}
}
/// <summary>
/// 保存数据值
/// </summary>
/// <param name="nodeName">节点</param>
/// <param name="subNodeName">子节点</param>
/// <param name="key">Key值</param>
/// <param name="valueDic">名称和值对应的字典</param>
public void SetValueByKey(string nodeName, string subNodeName, string key, Dictionary<string, string> valueDic)
{
//初始化XML文档
XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings()
{
IgnoreComments = true//忽略文档里面的注释
};
XmlReader reader = XmlReader.Create(XmlPath, settings);
xmlDoc.Load(reader);
XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement
string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", key);
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath); //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
if (null != selectXe)
{
//找到了值就进行修改
//selectXe.SetAttribute("TypeName", "修改值");
//读取完成以后就关闭
reader.Close();
selectXe.ParentNode.RemoveChild(selectXe);
//selectXe.RemoveAll();
xmlDoc.Save(XmlPath);
//删除之后再新增
InsertValueByKey(nodeName, subNodeName, key, valueDic);
}
else
{
//读取完成以后就关闭
reader.Close();
//没有找到的场合,进行新增
InsertValueByKey(nodeName, subNodeName, key, valueDic);
}
}
#endregion
#region 新增数据
/// <summary>
/// 追加节点
/// </summary>
/// <param name="nodeName">大类节点名称</param>
/// <param name="subNodeName">小类节点名称</param>
/// <param name="key">key值</param>
/// <param name="insertValue">修改值</param>
public void InsertValueByKey(string nodeName, string subNodeName, string key, string insertValue)
{
//初始化XML文档
XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings()
{
IgnoreComments = true //忽略文档里面的注释
};
XmlReader reader = XmlReader.Create(XmlPath, settings);
xmlDoc.Load(reader);
//查找nodeName
XmlNode root = xmlDoc.SelectSingleNode(RootName + nodeName);
//根节点不存在的场合
if (null == root)
{
root = xmlDoc.SelectSingleNode(RootName.Substring(0, RootName.LastIndexOf("/")));//查找nodeName
//创建大类节点
XmlElement bigNode = xmlDoc.CreateElement(nodeName);//创建一个subNodeName 节点
//创建子节点
XmlElement nodeXml = CreateSubElement(xmlDoc, subNodeName, key, insertValue);
bigNode.AppendChild(nodeXml);
root.AppendChild(bigNode);//添加到subNodeName节点中
}
else
{
//创建子节点
XmlElement nodeXml = CreateSubElement(xmlDoc, subNodeName, key, insertValue);
root.AppendChild(nodeXml);//添加到subNodeName节点中
}
//读取完成以后就关闭
reader.Close();
xmlDoc.Save(XmlPath);
}
/// <summary>
/// 保存值
/// </summary>
/// <param name="nodeName">节点名称</param>
/// <param name="subNodeName">子节点名称</param>
/// <param name="key">key值</param>
/// <param name="valueDic">名称和值对应的字典</param>
public void InsertValueByKey(string nodeName, string subNodeName, string key, Dictionary<string, string> valueDic)
{
//初始化XML文档
XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings()
{
IgnoreComments = true//忽略文档里面的注释
};
XmlReader reader = XmlReader.Create(XmlPath, settings);
xmlDoc.Load(reader);
//查找nodeName
XmlNode root = xmlDoc.SelectSingleNode(RootName + nodeName);
//根节点不存在的场合
if (null == root)
{
root = xmlDoc.SelectSingleNode(RootName.Substring(0, RootName.LastIndexOf("/")));//查找nodeName
//创建大类节点
XmlElement bigNode = xmlDoc.CreateElement(nodeName);//创建一个subNodeName 节点
//创建子节点
XmlElement nodeXml = CreateSubElement(xmlDoc, subNodeName, key, valueDic);
bigNode.AppendChild(nodeXml);
root.AppendChild(bigNode);//添加到subNodeName节点中
}
else
{
//创建子节点
XmlElement nodeXml = CreateSubElement(xmlDoc, subNodeName, key, valueDic);
root.AppendChild(nodeXml);//添加到subNodeName节点中
}
//读取完成以后就关闭
reader.Close();
xmlDoc.Save(XmlPath);
}
/// <summary>
///创建子节点
/// </summary>
/// <param name="xmlDoc"></param>
/// <param name="subNodeName"></param>
/// <param name="key"></param>
/// <param name="insertValue"></param>
private XmlElement CreateSubElement(XmlDocument xmlDoc, string subNodeName, string key, string insertValue)
{
XmlElement nodeXml = xmlDoc.CreateElement(subNodeName);//创建一个subNodeName 节点
nodeXml.SetAttribute("Key", key);//设置该节点genre属性
nodeXml.SetAttribute("Value", insertValue);//设置该节点genre属性
return nodeXml;
}
/// <summary>
/// 创建子节点
/// </summary>
/// <param name="xmlDoc"></param>
/// <param name="subNodeName"></param>
/// <param name="typeId"></param>
/// <param name="typeName"></param>
/// <param name="dic"></param>
/// <returns></returns>
private static XmlElement CreateSubElement(XmlDocument xmlDoc, string subNodeName, string key, Dictionary<string, string> valueDic)
{
XmlElement nodeXml = xmlDoc.CreateElement(subNodeName);//创建一个subNodeName 节点
nodeXml.SetAttribute("Key", key);//设置该节点genre属性
foreach (var tagKey in valueDic.Keys)
{
nodeXml.SetAttribute(tagKey, valueDic[tagKey]);//设置该节点genre属性
}
return nodeXml;
}
#endregion
#region 删除
/// <summary>
/// 删除子节点下指定key的值
/// </summary>
/// <param name="nodeName"></param>
/// <param name="subNodeName"></param>
/// <param name="typeId"></param>
public void DelSubNodeByKey(string nodeName, string subNodeName, string key)
{
//初始化XML文档
XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings()
{
IgnoreComments = true//忽略文档里面的注释
};
XmlReader reader = XmlReader.Create(XmlPath, settings);
xmlDoc.Load(reader);
XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement
string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", key);
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath); //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
//读取完成以后就关闭
reader.Close();
if (null != selectXe)
{
selectXe.ParentNode.RemoveChild(selectXe);
//selectXe.RemoveAll();
xmlDoc.Save(XmlPath);
}
}
/// <summary>
/// 删除节点下所有数据
/// </summary>
/// <param name="nodeName">节点名称</param>
public void DelNodeData(string nodeName)
{
//初始化XML文档
XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings()
{
IgnoreComments = true//忽略文档里面的注释
};
XmlReader reader = XmlReader.Create(XmlPath, settings);
xmlDoc.Load(reader);
XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement
string strPath = RootName + nodeName;
XmlNode selectXe = xe.SelectSingleNode(strPath); //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
//读取完成以后就关闭
reader.Close();
if (null != selectXe)
{
//selectXe.ParentNode.RemoveChild(selectXe);
selectXe.RemoveAll();
xmlDoc.Save(XmlPath);
}
}
#endregion
#endregion
}
08-22