xml处理类

 

代码
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Web;
using System.Xml;
using System.Xml.Linq;


namespace Moosoft.OA.Public
{
    
/// <summary>
    
/// XML操作类
    
/// </summary>
    
/// <remarks>XML操作类</remarks>
    public class XMLControl
    {
        
#region 私有变量
        
/// <summary>
        
/// 文件路径
        
/// </summary>
        private string xmlFilePath;
        
/// <summary>
        
/// 文件路径类型
        
/// </summary>
        private enumXmlPathType xmlFilePathType;
        
/// <summary>
        
/// 实例化一个XmlDocument对象
        
/// </summary>
        private XmlDocument xmlDoc = new XmlDocument();
        
#endregion

        
#region 私有函数
        
/// <summary>
        
/// 创建xml文件
        
/// </summary>
        
/// <param name="xmlName">文件路径</param>
        
/// <returns></returns>
        private bool CreateXML(string xmlName)
        {
            
try
            {
                XmlTextWriter xmltx
=null;
                
if (string.IsNullOrEmpty(xmlName))
                {
                    xmltx 
= new XmlTextWriter(HttpContext.Current.Server.MapPath(xmlName), Encoding.UTF8);
                }
                
else
                {
                    xmltx 
= new XmlTextWriter(xmlName, Encoding.UTF8);
                }
                xmltx.WriteStartDocument();
                xmltx.WriteStartElement(
"ItDeer");
                xmltx.WriteEndElement();
                xmltx.WriteEndDocument();
                xmltx.Close();                
                
return true;
            }
            
catch { return false; }
        }

        
/// <summary>
        
/// 创建xml文件
        
/// </summary>
        
/// <param name="xmlName">文件路径</param>
        
/// <param name="RootName">根名称</param>
        
/// <returns></returns>
        private bool CreateXML(string xmlName, XElement RootName)
        {
            
//try
            
//{
                XmlTextWriter xmltx = null;
                
if (string.IsNullOrEmpty(xmlName))
                {
                    xmltx 
= new XmlTextWriter(HttpContext.Current.Server.MapPath(xmlName), Encoding.UTF8);
                }
                
else
                {
                    xmltx 
= new XmlTextWriter(xmlName, Encoding.UTF8);
                }
                xmltx.WriteStartDocument();
                xmltx.WriteStartElement(RootName.Name.ToString());
                
foreach (XAttribute xa in RootName.Attributes())
                {
                    xmltx.WriteAttributeString(xa.Name.ToString(), xa.Value);
                }

                xmltx.WriteEndElement();
                xmltx.WriteEndDocument();
                xmltx.Close();
                SaveXmlDocument();
                
return true;
            
//}
            
//catch { return false; }
        }

        
/// <summary>
        
/// 获取XmlDocument实例化对象
        
/// </summary>
        
/// <returns>指定的XML描述文件的路径</returns>
        private XmlDocument GetXmlDocument()
        {
            XmlDocument doc 
= null;

            
if (this.xmlFilePathType == enumXmlPathType.AbsolutePath)
            {
                doc 
= GetXmlDocumentFromFile(xmlFilePath);
            }
            
else if (this.xmlFilePathType == enumXmlPathType.VirtualPath)
            {
                doc 
= GetXmlDocumentFromFile(HttpContext.Current.Server.MapPath(xmlFilePath));
            }
            
return doc;
        }
        
/// <summary>
        
/// 获取文件XML路径
        
/// </summary>
        
/// <param name="tempXmlFilePath"></param>
        
/// <returns></returns>
        private XmlDocument GetXmlDocumentFromFile(string tempXmlFilePath)
        {
            
try
            {
                
string xmlFileFullPath = tempXmlFilePath;
                xmlDoc.Load(xmlFileFullPath);
                
return xmlDoc;
            }
            
catch
            {
                
if (CreateXML(tempXmlFilePath))
                {
                    
return GetXmlDocumentFromFile(tempXmlFilePath);
                }
                
else
                {
                    
return null;
                }
            }
        }
        
/// <summary>
        
/// 获取根节点路径
        
/// </summary>
        
/// <returns></returns>
        private string GetPath()
        {
            
string root = xmlDoc.DocumentElement.Name;
            
string result = root + "[last()]";
            
return result;
        }
        
#endregion

        
#region 共有属性及枚举、方法
        
/// <summary>
        
/// 获取根节点路径
        
/// </summary>
        public string Path
        {
            
get { return GetPath(); }
        }
        
/// <summary>
        
/// 获取根节点名称
        
/// </summary>
        public string RootName
        {
            
get { return xmlDoc.DocumentElement.Name; }
        }
        
/// <summary>
        
/// 获取根节点
        
/// </summary>
        public XmlNode Root
        {
            
get { return xmlDoc.DocumentElement; }
        }
        
/// <summary>
        
/// 枚举,XML文件的路径
        
/// </summary>
        
/// <remarks>枚举,XML文件的路径</remarks>
        public enum enumXmlPathType
        {
            
/// <summary>
            
/// 相对路径
            
/// </summary>
            AbsolutePath,
            
/// <summary>
            
/// 虚拟路径
            
/// </summary>
            VirtualPath
        }
        
/// <summary>
        
/// 设置XML文件路径属性
        
/// </summary>
        public string XmlFilePath
        {
            
set
            {
                xmlFilePath 
= value;
            }
        }
        
/// <summary>
        
/// 设置文件路径类型
        
/// </summary>
        public enumXmlPathType XmlFilePathTyp
        {
            
set
            {
                xmlFilePathType 
= value;
            }
        }
        
#endregion

        
#region 构造函数
        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="tempXmlFilePath">XML文件相对路径</param>
        public XMLControl(string tempXmlFilePath)
        {
            
this.xmlFilePathType = enumXmlPathType.VirtualPath;
            
this.xmlFilePath = tempXmlFilePath;
            GetXmlDocument();
        }
        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="tempXmlFilePath">XML文件路径</param>
        
/// <param name="tempXmlFilePathType">文件路径类型</param>
        public XMLControl(string tempXmlFilePath, enumXmlPathType tempXmlFilePathType)
        {
            
this.xmlFilePathType = tempXmlFilePathType;
            
this.xmlFilePath = tempXmlFilePath;
            GetXmlDocument();
        }
        
#endregion

        
/// <param name="tempXmlFilePath">XML文件路径</param>
        
/// <param name="Root">跟节点名称</param>
        
/// <param name="tempXmlFilePathType">文件路径类型</param>
        public XMLControl(string tempXmlFilePath, XElement Root, Moosoft.OA.Public.XMLControl.enumXmlPathType tempXmlFilePathType)
        {
            
this.xmlFilePathType = tempXmlFilePathType;
            
this.xmlFilePath = tempXmlFilePath;
            
if (!File.Exists(xmlFilePath))
            {
                FileSystemObject.Create(xmlFilePath, FsoMethod.File);
                System.Threading.Thread.Sleep(
1000);
                CreateXML(xmlFilePath, Root);
            }
            GetXmlDocument();
        }

        
#region 读取指定节点的指定属性值
        
/// <summary>
        
/// 获取节点属性
        
/// </summary>
        public List<XAttribute> GetXmlNodeAttribute(string XPath)
        {
            XmlNodeList ndlist 
= xmlDoc.SelectNodes(XPath);
            List
<XAttribute> attList = new List<XAttribute>();
            
for (int i = 0; i < ndlist.Count; i++)
            {
                XmlAttributeCollection xmlAttr 
= ndlist[i].Attributes;
                
for (int n = 0; n < xmlAttr.Count; n++)
                { 
                    attList.Add(
new XAttribute(xmlAttr[n].Name,xmlAttr[n].Value));
                }
            }
            
return attList;
        }

        
        
#endregion

        
#region 设置节点的属性值
        
/// <summary>
        
/// 设置一个指定节点的指定属性的值
        
/// </summary>
        
/// <param name="XPath">节点路径</param>
        
/// <param name="attribute">属性名称</param>
        
/// <returns></returns>
        public bool SetXmlNodeAttribute(string XPath, XAttribute attribute)
        {
            
//获取节点列表
            XmlNodeList ndlist = xmlDoc.SelectNodes(XPath);
            
try
            {
                
for (int i = 0; i < ndlist.Count; i++)
                {
                    XmlAttributeCollection xmlAttr 
= ndlist[i].Attributes;
                    
bool flag = false; ;
                    
for (int m = 0; m < xmlAttr.Count; m++)
                    {
                        
if (xmlAttr[m].Name == attribute.Name.ToString())
                        {
                            xmlAttr.Item(m).Value 
= attribute.Value;
                            flag 
= true;
                            
break;
                        }
                    }
                    
if (!flag)
                    {
                       
return AddAttribute(XPath, attribute);
                    }
                }
                
return true;
            }
            
catch
            {
                
return false;
            }
        }

        
/// <summary>
        
/// 设置一个指定节点的指定属性的值
        
/// </summary>
        
/// <param name="XPath">节点路径</param>
        
/// <param name="attribute">属性名称</param>
        
/// <returns></returns>
        public bool SetXmlNodeAttribute(string XPath, List<XAttribute> attribute)
        {
            
bool flag = true;
            
for (int i = 0; i < attribute.Count; i++)
            {
               flag 
= SetXmlNodeAttribute(XPath, attribute[i]);
               
if (!flag)
               {
                   
break;
               }
            }
            
return flag;
        }
        
#endregion

        
#region 添加属性
        
/// <summary>
        
/// 向指定的节点添加指定值得属性
        
/// </summary>
        
/// <param name="XPath">节点路径</param>
        
/// <param name="attribute">添加的属性</param>
        
/// <returns>bool值</returns>
        public bool AddAttribute(string XPath, List<XAttribute> attribute)
        {
            XmlNodeList ndlist 
= xmlDoc.SelectNodes(XPath);
            
for (int i = 0; i < ndlist.Count; i++)
            {
                XmlElement xe 
= (XmlElement)ndlist[i];
                
foreach (XAttribute xa in attribute)
                {
                    XmlAttribute tmp 
= xmlDoc.CreateAttribute(xa.Name.ToString());
                    tmp.Value 
= xa.Value;
                    xe.Attributes.Append(tmp);
                }
            }
            
return true;
        }
        
/// <summary>
        
/// 向指定的节点添加指定值得属性
        
/// </summary>
        
/// <param name="XPath">节点路径</param>
        
/// <param name="attribute">添加的属性</param>
        
/// <returns>bool值</returns>
        public bool AddAttribute(string XPath, XAttribute attribute)
        {
            XmlNodeList ndlist 
= xmlDoc.SelectNodes(XPath);
            
for (int i = 0; i < ndlist.Count; i++)
            {
                XmlElement xe 
= (XmlElement)ndlist[i];
                XmlAttribute tmp 
= xmlDoc.CreateAttribute(attribute.Name.ToString());
                tmp.Value 
= attribute.Value;
                xe.Attributes.Append(tmp);
            }
            
return true;
        }
        
#endregion

        
#region 删除属性
        
/// <summary>
        
/// 删除指定节点的指定值的属性
        
/// </summary>
        
/// <param name="XPath">节点路径</param>
        
/// <param name="attribute">属性列表</param>
        
/// <returns>bool值</returns>
        public bool DeleteAttribute(string XPath, List<XAttribute> attribute)
        {
            
for (int i = 0; i < attribute.Count; i++)
            {
                DeleteAttribute(XPath, attribute[i]);
            }
            
return true;
        }

        
/// <summary>
        
/// 删除指定节点的指定值的属性
        
/// </summary>
        
/// <param name="XPath">节点路径</param>
        
/// <param name="attribute">属性列表</param>
        
/// <returns>bool值</returns>
        public bool DeleteAttribute(string XPath, XAttribute attribute)
        {
            XmlNodeList ndlist 
= xmlDoc.SelectNodes(XPath);
            
for (int i = 0; i < ndlist.Count; i++)
            {
                XmlElement xe 
= (XmlElement)ndlist[i];
                
if (xe.Attributes[attribute.Name.ToString()].Value == attribute.Value)
                {
                    xe.RemoveAttribute(attribute.Name.ToString());
                }
            }
            
return true;
        }

        
#endregion

        
#region 获取节点值
        
/// <summary>
        
/// 获取节点值
        
/// </summary>
        public List<XElement> GetXmlNodesValue(string XPath)
        {
            XmlNodeList ndlist 
= xmlDoc.SelectNodes(XPath);
            List
<XElement> elementList = new List<XElement>();
            
for (int i = 0; i < ndlist.Count; i++)
            {
                XmlElement element 
= (XmlElement)ndlist[i];
                XmlAttributeCollection attlist 
= element.Attributes;
                XElement tmp 
= new XElement(ndlist[i].Name, ndlist[i].Value);
                
for (int n = 0; n < attlist.Count; n++)
                { 
                    tmp.Add(
new XAttribute(attlist[n].Name,attlist[n].Value));
                }

                
if (element.HasChildNodes)
                {
                    XmlNodeList child 
= element.ChildNodes;
                    
for (int n = 0; n < child.Count; n++)
                    {
                        XElement ss 
= XElement.Parse(child[n].OuterXml);
                        tmp.Add(ss);
                    }
                }
                elementList.Add(tmp);
            }
            
return elementList;
        }
        
#endregion

        
#region 设置节点值

        
/// <summary>
        
/// 设置节点值
        
/// </summary>
        
/// <param name="index">节点序号</param>
        
/// <param name="xmlNodePath">节点路径</param>
        
/// <param name="xmlNodeValue">节点值</param> 
        
/// <returns>bool值</returns>        
        public bool SetXmlNodeValue(int index, string xmlNodePath, string xmlNodeValue)
        {
            
try
            {
                
//如果没有指定Index的值,则设置一个节点的值
                if (index != -1)
                {
                    
//获取父节点下所有的相同节点
                    XmlNodeList ndlist = xmlDoc.SelectNodes(xmlNodePath);
                    
//获取节点列表中的一个节点
                    XmlNode xn = ndlist[index];
                    
//设置一个节点值
                    xn.InnerText = xmlNodeValue;
                }
                
else
                {
                    
//获取节点并设置一个值
                    XmlNode xn = xmlDoc.SelectSingleNode(xmlNodePath);
                    xn.InnerText 
= xmlNodeValue;
                }
                
return true;
            }
            
catch
            {
                
return false;
            }
        }
        
/// <summary>
        
/// 设置一个节点的值
        
/// </summary>
        
/// <param name="xmlNodePath">节点路径</param>
        
/// <param name="xmlNodeValue">节点值</param>
        
/// <returns>bool值</returns>
        public bool SetXmlNodeValue(string xmlNodePath, string xmlNodeValue)
        {
            
return SetXmlNodeValue(-1, xmlNodePath, xmlNodeValue);
        }
        
#endregion

        
#region 添加节点
        
/// <summary>
        
/// 在指定父节点下插入一个指定数值、指定属性的子节点
        
/// </summary>
        
/// <param name="XPath">父节点路径</param>
        
/// <param name="Node">节点内容</param>
        
/// <returns>bool值</returns>
        public bool AddChildNode(string XPath, XElement Node)
        {
            XmlNodeList ndlist 
= xmlDoc.SelectNodes(XPath);
            
//try
            
//{
                foreach (XmlNode xn in ndlist)
                {
                    XmlNode childXmlNode 
= xmlDoc.CreateElement(Node.Name.ToString());
                    
if (!string.IsNullOrEmpty(Node.Value))
                    {
                        childXmlNode.Value 
= Node.Value;
                    }
                    
if (XPath == "/")
                    {
                        xmlDoc.DocumentElement.AppendChild(childXmlNode);
                    }
                    
else
                    {
                        xn.AppendChild(childXmlNode);
                    }
                    IEnumerable
<XAttribute> NodeAttribute = Node.Attributes();
                    
foreach (XAttribute att in NodeAttribute)
                    {
                        XmlElement ele 
= (XmlElement)childXmlNode;
                        ele.SetAttribute(att.Name.ToString(), att.Value);
                    }
                }
                
return true;
            
//}
            
//catch
            
//{
            
//    return false;
            
//}
        }

         
/// <summary>
        
/// 在指定父节点下插入一个指定数值、指定属性的子节点
        
/// </summary>
        
/// <param name="XPath">父节点路径</param>
        
/// <param name="Node">节点内容</param>
        
/// <returns>bool值</returns>
        public bool AddChildNode(string XPath, List<XElement> Node)
        {
            
bool flag = true;
            
for (int i = 0; i < Node.Count; i++)
            {
                flag 
= AddChildNode(XPath, Node);
                
if (!flag)
                {
                    
break;
                }
            }
            
return flag;
        }
        
#endregion

        
#region 删除节点

        
/// <summary>
        
/// 删除指定一个的节点及其下面的子节点
        
/// </summary>
        
/// <param name="NodeIndex">节点索引</param>
        
/// <param name="NodePath">节点路径</param>
        
/// <returns>bool值</returns>
        public bool DeleteNode(int NodeIndex, string NodePath)
        {
            
try
            {
                
//是否有多行,并指定删除哪一行
                if (NodeIndex != -1)
                {
                    
//获取节点列表
                    XmlNodeList ndlist = xmlDoc.SelectNodes(NodePath);
                    
//获取要删除的节点
                    XmlNode xn = (XmlNode)ndlist[NodeIndex];
                    
//删除节点
                    xn.ParentNode.RemoveChild(xn);
                }
                
else
                {
                    
//获取节点列表
                    XmlNodeList ndlist = xmlDoc.SelectNodes(NodePath);
                    
//删除列表
                    foreach (XmlNode xn in ndlist)
                    {
                        xn.ParentNode.RemoveChild(xn);
                    }
                }
            }
            
catch { return false; }
            
return true;
        }
        
/// <summary>
        
/// 删除节点及节点下的子节点
        
/// </summary>
        
/// <param name="NodePath">节点路径</param>
        
/// <returns>bool值</returns>
        public bool DeleteNode(string NodePath)
        {
            
return DeleteNode(-1, NodePath);
        }
        
#endregion

        
#region 保存XML文件
        
/// <summary>
        
/// 保存文件
        
/// </summary>
        public void SaveXmlDocument()
        {
            
try
            {
                
//保存设置的结果
                xmlDoc.Save(HttpContext.Current.Server.MapPath(xmlFilePath));
            }
            
catch
            {
                
try { xmlDoc.Save(xmlFilePath); }
                
catch (XmlException xmle)
                {
                    
throw xmle;
                }
            }
        }
        
/// <summary>
        
/// 保存文件
        
/// </summary>
        
/// <param name="tempXMLFilePath">文件路径</param>
        public void SaveXmlDocument(string tempXMLFilePath)
        {
            
try
            {
                
//保存设置的结果
                xmlDoc.Save(tempXMLFilePath);
            }
            
catch (XmlException xmle)
            {
                
throw xmle;
            }
        }
        
#endregion
    }
}
原文地址:https://www.cnblogs.com/studio313/p/1695374.html