XML操作类

代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.IO;
using System.Data;

namespace Jd.WebCapture
{
    
public class XmlIO
    {
        
#region 属性
        
protected XmlDocument xmlDoc = null;
        
protected string xmlFileName = null;
        XmlDeclaration xmlDecl 
= null;

        
private readonly Object m_fileLock = new Object();
        
#endregion

        
#region 构造函数和析构函数
        
public XmlIO()
        {
            
this.xmlDoc = new XmlDocument();
            
//定义一个元素
            XmlElement xmlEle;
            
//加入XML文件的声明段落,,<?xml version="1.0" encoding="gb2312"?>
            xmlDecl = xmlDoc.CreateXmlDeclaration("1.0""gb2312"null);
            xmlDoc.AppendChild(xmlDecl);
        }

        
public XmlIO(string fileName)
        {
            
this.xmlDoc = new XmlDocument();
            
try
            {
                xmlDoc.Load(fileName);
                xmlFileName 
= fileName;
            }
            
catch(Exception ex)
            {
                xmlDoc 
= null;
                
throw ex;
            }
        }
        
~XmlIO()
        {
            xmlDoc 
= null
        }
        
#endregion

        
#region 方法
        
/// <summary>
        
/// 根据XML文件流生成XML文件
        
/// </summary>
        
/// <param name="fileName">XML文件全名</param>
        
/// <param name="strXml">XML文件流</param>
        public void CreateXmlFile(string fileName, string strXml)
        {
            
//获取文件路径
            string fPath = Path.GetDirectoryName(fileName);
            
if (!Directory.Exists(fPath))
            {
                Directory.CreateDirectory(fPath);
            }
            xmlDoc 
= new XmlDocument();
            xmlDoc.LoadXml(strXml);
            
if (File.Exists(fileName))
            {
                File.SetAttributes(fileName, FileAttributes.Normal); 
            }
            xmlDoc.Save(fileName);
            xmlFileName 
= fileName;
        }

        
/// <summary>
        
/// 获取单个结点的值
        
/// </summary>
        
/// <param name="xpath">结点路径</param>
        
/// <returns>结点值</returns>
        public string GetSingleNodeValue(string xpath)
        {
            XmlNode node 
= xmlDoc.SelectSingleNode(xpath);
            
if (node == null)
            {
                
return "";
            }
            
else
            {
                
return node.InnerText.ToString();
            }
        }

        
/// <summary>
        
/// 根据结点返回数据,返回值类型为DataView
        
/// </summary>
        
/// <param name="xpath">xml结点路径</param>
        
/// <returns>返回的数据视图</returns>
        public DataView GetData(string xpath)
        {           
            DataSet ds 
= new DataSet();
            StringReader reader 
= new StringReader(xmlDoc.SelectSingleNode(xpath).OuterXml);
            ds.ReadXml(reader);
            
if (ds.Tables.Count == 0)
            {
                
return null;
            }
            
else
            {
                
return ds.Tables[0].DefaultView;
            }
        }

        
/// <summary>
        
/// 根据指定节点的名称,来返回节点内容,尽管返回的是一条记录,
        
/// 但还是作为DataView进行返回,这样做的目的是为了更好的访问性
        
/// </summary>
        
/// <param name="nodeCollection">父结点路径</param>
        
/// <param name="node">子结点名称</param>
        
/// <param name="content">子结点内容</param>
        
/// <returns></returns>
        public DataView GetData(string nodeCollection,string node,string content)
        {
            XmlNodeList fatherNode 
= xmlDoc.GetElementsByTagName(nodeCollection);
            XmlNodeList nodes 
= fatherNode[0].ChildNodes;
            
for (int i = 0; i < nodes.Count; i++)
            {
                
for (int j = 0; j < nodes[i].ChildNodes.Count; j++)
                {
                    
if (nodes[i].ChildNodes[j].Name == node && nodes[i].ChildNodes[j].InnerText.Replace("\r\n""").Trim() == content)
                    {
                        StringReader reader 
= new StringReader(nodes[i].OuterXml);
                        DataSet ds 
= new DataSet();
                        ds.ReadXml(reader);
                        
if (ds.Tables.Count == 0)
                        {
                            
return null;
                        }
                        
else
                        {
                            
return ds.Tables[0].DefaultView;
                        }
                    }
                }
            }
            
return null;
        }

        
/// <summary>
        
/// 此函数仅用于操作DomainRegex.xml配置文件,用于从中获取有效的目标站点信息
        
/// </summary>
        
/// <param name="nodeCollection">根结点</param>
        
/// <returns>采集目标站点的信息列表</returns>
        public List<DomainRegexInfo> GetDomainRegexList(string nodeCollection)
        {
            List
<DomainRegexInfo> domainInfos = new List<DomainRegexInfo>();
            XmlNode tempNode 
= null;
            XmlNodeList fatherNode 
= xmlDoc.GetElementsByTagName(nodeCollection);
            XmlNodeList nodes 
= fatherNode[0].ChildNodes;
            
for (int i = 0; i < nodes.Count; i++)
            {
                DomainRegexInfo domainInfo 
= new DomainRegexInfo();
                tempNode 
= nodes[i].SelectSingleNode("DomainName");
                
if (tempNode != null)
                {
                    domainInfo.DomainName 
= tempNode.InnerText.Replace("\r\n""").Trim();
                }
                tempNode 
= nodes[i].SelectSingleNode("DomainAlias");
                
if (tempNode != null)
                {
                    domainInfo.DomainAlias 
= tempNode.InnerText.Replace("\r\n""").Trim();
                }
                tempNode 
= nodes[i].SelectSingleNode("TitlePrefix");
                
if (tempNode != null)
                {
                    domainInfo.TitlePrefix 
= tempNode.InnerText.Replace("\r\n""").Trim();
                }
                tempNode 
= nodes[i].SelectSingleNode("TitlePostfix");
                
if (tempNode != null)
                {
                    domainInfo.TitlePostfix 
= tempNode.InnerText.Replace("\r\n""").Trim();
                }
                tempNode 
= nodes[i].SelectSingleNode("ContentPrefix");
                
if (tempNode != null)
                {
                    domainInfo.ContentPrefix 
= tempNode.InnerText.Replace("\r\n""").Trim(); 
                }
                tempNode 
= nodes[i].SelectSingleNode("ContentPostfix");
                
if (tempNode != null)
                {
                    domainInfo.ContentPostfix 
= tempNode.InnerText.Replace("\r\n""").Trim();
                }
                domainInfos.Add(domainInfo);
            }
            
return domainInfos;
        }

        
/// <summary>
        
/// 从配置文件获取html标签替换信息(RegexConfig.xml)
        
/// </summary>
        
/// <param name="mainNode">根结点</param>
        
/// <returns></returns>
        public List<RegexInfo> GetRegexInfos(string mainNode)
        {
            List
<RegexInfo> regexInfos = new List<RegexInfo>();
            XmlNode tempNode 
= null;
            XmlNodeList fatherNode 
= xmlDoc.GetElementsByTagName(mainNode);
            XmlNodeList nodes 
= fatherNode[0].ChildNodes;
            
for (int i = 0; i < nodes.Count; i++)
            {
                RegexInfo regexInfo 
= new RegexInfo();
                tempNode 
= nodes[i].SelectSingleNode("RegexName");
                
if (tempNode != null)
                {
                    regexInfo.RegexName 
= tempNode.InnerText.Replace("\r\n""").Trim();
                }
                tempNode 
= nodes[i].SelectSingleNode("RegexExpression");
                
if (tempNode != null)
                {
                    regexInfo.RegexExpression 
= tempNode.InnerText.Replace("\r\n""").Trim();
                }
                regexInfos.Add(regexInfo);
            }
            
return regexInfos;
        }
       

        
/// <summary>
        
/// 删除指定路径结点及其所有的子节点
        
/// </summary>
        
/// <param name="node">要删除的节点路径</param>
        public void DeleteNode(string node)
        {
            XmlNodeList nodes 
= xmlDoc.GetElementsByTagName(node);
            XmlNode delNode 
= nodes[0];
            delNode.ParentNode.RemoveChild(delNode);
        }
        
        
//举例<tasks><task><id>1</id><name>soukey</name></task><task><id>2</id><name>采摘</name></task></tasks>
        
//删除子节点是指删除task节点,但根据的条件是指定的id或者name符合content的内容,
        
//所以调用方法是DeleteChildNodes("tasks","name","soukey")
        
//调用后,将删除task中name=soukey的task节点,传入的MainNode必须是一个集合,如果传入的是一个结合子节点,
        
//将导致错误
        /// <summary>
        
/// 删除子节点中符合content内容的子节点
        
/// </summary>
        
/// <param name="NodeCollection">父节点路径</param>
        
/// <param name="Node">准备删除的节点的子节点</param>
        
/// <param name="content">要删除的结点的子结点内容</param>
        public void DeleteChildNodes(string NodeCollection, string Node, string content)
        {
            XmlNodeList fathernode 
= xmlDoc.GetElementsByTagName(NodeCollection);
            XmlNodeList nodes 
= fathernode[0].ChildNodes;

            
for (int i = 0; i < nodes.Count; i++)
            {
                
for (int j = 0; j < nodes[i].ChildNodes.Count; j++)
                {
                    
//for (int m=0;
                    if (nodes[i].ChildNodes[j].Name == Node && nodes[i].ChildNodes[j].InnerText.Replace("\r\n""").Trim() == content)
                    {
                        fathernode[
0].RemoveChild(nodes[i]);
                        
return;
                    }
                }
            }
        }

        
//插入一个节点和此节点的一子节点
        /// <summary>
        
/// 插入节点和它的一个子节点
        
/// </summary>
        
/// <param name="MainNode">根结点名称</param>
        
/// <param name="ChildNode">插入的结点名称</param>
        
/// <param name="Element">插入结点的子节点名称</param>
        
/// <param name="Content">子节点文本值</param>
        public void InsertNode(string MainNode, string ChildNode, string Element, string Content)
        {
            XmlNode objRootNode 
= xmlDoc.SelectSingleNode(MainNode);
            XmlElement objChildNode 
= xmlDoc.CreateElement(ChildNode);
            objRootNode.AppendChild(objChildNode);
            XmlElement objElement 
= xmlDoc.CreateElement(Element);
            objElement.InnerText 
= Content;
            objChildNode.AppendChild(objElement);
        }

        
//修改一个节点包含的信息内容
        /// <summary>
        
/// 修改一个节点的信息内容
        
/// </summary>
        
/// <param name="Element">节点名称</param>
        
/// <param name="Old_Content">节点修改前的内容</param>
        
/// <param name="Content">节点的新内容</param>
        public void EditNode(string Element, string Old_Content, string Content)
        {
            XmlNodeList nodes 
= xmlDoc.GetElementsByTagName(Element);
            
for (int i = nodes.Count - 1; i >= 0; i--)
            {
                
if (nodes[i].ChildNodes[0].InnerText == Old_Content)
                {
                    nodes[i].ChildNodes[
0].InnerText = Content;
                }
            }
        }

        
//修改一个节点本身的值
        /// <summary>
        
/// 修改一点结点的值
        
/// </summary>
        
/// <param name="nodPath">结点名称</param>
        
/// <param name="OldName">旧结点值</param>
        
/// <param name="NewName">新结点值</param>
        public void EditNodeName(string nodPath, string OldName, string NewName)
        {
            XmlNode Nod 
= xmlDoc.SelectSingleNode(nodPath);
            
string xml = Nod.InnerXml;
            DeleteNode(OldName);
            nodPath 
= nodPath.Substring(0, nodPath.LastIndexOf("/"));
            InsertElement(nodPath, NewName, xml);
        }

        
//修改指定结点的文本值
        /// <summary>
        
/// 修改指定结点的值
        
/// </summary>
        
/// <param name="nodPath">结点路径</param>
        
/// <param name="NewValue">新的结点值</param>
        public void EditNodeValue(string nodPath, string NewValue)
        {
            XmlNode node 
= xmlDoc.SelectSingleNode(nodPath);
            node.InnerText 
= NewValue;
        }

        
/// <summary>
        
/// 修改指定结点的值
        
/// </summary>
        
/// <param name="NodeCollection">父结点</param>
        
/// <param name="Node">指定结点的某一子结点名称</param>
        
/// <param name="condition">指定结点的某一子结点当前值</param>
        
/// <param name="ValueName">指定结点需要修改的子结点名称</param>
        
/// <param name="value">指定结点需要修改的子结点的新值</param>
        public void EditNodeValue(string NodeCollection, string Node, string condition, string ValueName, string value)
        {
            XmlNodeList fathernode 
= xmlDoc.GetElementsByTagName(NodeCollection);
            XmlNodeList nodes 
= fathernode[0].ChildNodes;

            
for (int i = 0; i < nodes.Count; i++)
            {
                
for (int j = 0; j < nodes[i].ChildNodes.Count; j++)
                {
                    
if (nodes[i].ChildNodes[j].Name == Node && nodes[i].ChildNodes[j].InnerText.Replace("\r\n","").Trim() == condition)
                    {
                        XmlNode nod 
= nodes[i].SelectSingleNode(ValueName);
                        nod.InnerText 
= value;
                        
return;
                    }
                }
            }
        }


        
//附加一个节点,带一个属性
        /// <summary>
        
/// 附加一个带属性的结点
        
/// </summary>
        
/// <param name="MainNode">根结点</param>
        
/// <param name="Element">结点元素</param>
        
/// <param name="Attrib">属性名称</param>
        
/// <param name="AttribContent">属性值</param>
        
/// <param name="Content">结点文本值</param>
        public void InsertElement(string MainNode, string Element, string Attrib, string AttribContent, string Content)
        {
            XmlNode objNode 
= xmlDoc.SelectSingleNode(MainNode);
            XmlElement objElement 
= xmlDoc.CreateElement(Element);
            objElement.SetAttribute(Attrib, AttribContent);
            objElement.InnerText 
= Content;
            objNode.AppendChild(objElement);
        }

        
//附加一个节点
        /// <summary>
        
/// 附加一个节点,不带属性
        
/// </summary>
        
/// <param name="MainNode">根结点</param>
        
/// <param name="Element">附加结点</param>
        
/// <param name="Content">附加结点的内容</param>
        public void InsertElement(string MainNode, string Element, string Content)
        {
            XmlNode objNode 
= xmlDoc.SelectSingleNode(MainNode);
            XmlElement objElement 
= xmlDoc.CreateElement(Element);
            objElement.InnerXml 
= Content;
            objNode.AppendChild(objElement);
        }
  
        
/// <summary>
        
/// 保存XML文件
        
/// </summary>
        public void Save()
        {
            
try
            {
                
if (File.Exists(xmlFileName))
                {
                    File.SetAttributes(xmlFileName, System.IO.FileAttributes.Normal);
                }
                xmlDoc.Save(xmlFileName);
            }
            
catch (System.Exception ex)
            {
                
throw ex;
            }
        }

        
        
/// <summary>
        
/// 获取所有有效的域名列表(操作DomainRegex.xml文件)
        
/// </summary>
        
/// <param name="MainNode">根结点(DomainRegexMaps)</param>
        
/// <param name="Node">域名正则的结点信息</param>
        
/// <returns>返回有效的域名结点信息列表</returns>
        public List<string> GetValidDomainInfo(string mainNode, string node)
        {
            List
<string> validDomainNames=new List<string>();
            XmlNodeList fatherNode 
= xmlDoc.GetElementsByTagName(mainNode);
            XmlNodeList nodes 
= fatherNode[0].ChildNodes;
            
for (int i = 0; i < nodes.Count; i++)
            {
                
for (int j = 0; j < nodes[i].ChildNodes.Count; j++)
                {
                    
if (nodes[i].ChildNodes[j].Name == node)
                    {
                        validDomainNames.Add(nodes[i].ChildNodes[j].InnerText);
                    }
                }
            }
            
return validDomainNames;
        }

        
/// <summary>
        
/// 向域名结点下附加一个结点,该方法专用于DomainRegex.xml
        
/// </summary>
        
/// <param name="MainNode">根结点</param>
        
/// <param name="node">目标域名结点的某一子结点</param>
        
/// <param name="condition">目标域名结点的某一子结点的当前值</param>
        
/// <param name="newNode">要附加的子结点</param>
        
/// <param name="newNodeValue">要附加的子结点值</param>
        public void AppendNode(string MainNode, string node, string condition, string newNode, string newNodeValue)
        {
            XmlNodeList fatherNode 
= xmlDoc.GetElementsByTagName(MainNode);
            XmlNodeList nodes 
= fatherNode[0].ChildNodes;
            
for (int i = 0; i < nodes.Count; i++)
            {
                
for (int j = 0; j < nodes[i].ChildNodes.Count; j++)
                {
                    
if (nodes[i].ChildNodes[j].Name == node && nodes[i].ChildNodes[j].InnerText.Replace("\r\n""").Trim() == condition)
                    {
                        XmlElement newElement 
= xmlDoc.CreateElement(newNode);
                        newElement.InnerText 
= newNodeValue;
                        nodes[i].AppendChild(newElement);
                        
return;
                    }
                }
            }
        }

        
/// <summary>
        
/// 获取有效域名的配置信息
        
/// </summary>
        
/// <param name="MainNode">根目录</param>
        
/// <returns>有效域名信息列表</returns>
        public List<DomainRegexInfo> GetValidDomainInfos(string MainNode)
        {
            List
<DomainRegexInfo> domainInfos = new List<DomainRegexInfo>();
            XmlNode node
=null;
            XmlNodeList fatherNode 
= xmlDoc.GetElementsByTagName(MainNode);
            XmlNodeList nodes 
= fatherNode[0].ChildNodes;
            
for (int i = 0; i < nodes.Count; i++)
            {
                DomainRegexInfo domainInfo 
= new DomainRegexInfo();
                node 
= nodes[i].SelectSingleNode("DomainName");
                domainInfo.DomainName 
= node.InnerText.Trim();
                node 
= nodes[i].SelectSingleNode("DomainAlias");
                domainInfo.DomainAlias 
= node.InnerText.Trim();
                domainInfos.Add(domainInfo);
            }
            
return domainInfos;
        }

        
/// <summary>
        
/// 查询指定结点的某一子结点是否存在
        
/// </summary>
        
/// <param name="node">子结点名称</param>
        
/// <param name="condition">子结点值</param>
        
/// <returns></returns>
        public bool HasNodeValue(string mainNode,string node,string condition)
        {
            
bool IsHasNodeValue=false;
            XmlNodeList fatherNode 
= xmlDoc.GetElementsByTagName(mainNode);
            XmlNodeList nodes 
= fatherNode[0].ChildNodes;
            
for (int i = 0; i < nodes.Count; i++)
            {
                
for (int j = 0; j < nodes[i].ChildNodes.Count; j++)
                {
                    
if (nodes[i].ChildNodes[j].Name == node && nodes[i].ChildNodes[j].InnerText.Replace("\r\n","").Trim() == condition)
                    {
                        IsHasNodeValue 
= true;
                    }
                }
            }
            
return IsHasNodeValue;
        }

        
/// <summary>
        
/// 查询是否存在所需的子结点
        
/// </summary>
        
/// <param name="mainNode">根结点</param>
        
/// <param name="node">目标结点的一个特定子结点</param>
        
/// <param name="condition">特定子结点的值</param>
        
/// <param name="childNode">目标子结点</param>
        
/// <returns>是否存在特定的子结点</returns>
        public bool HasChildNode(string mainNode, string node,string condition,string childNode)
        {
            
bool IsHasChildNode = false;
            XmlNodeList fatherNode 
= xmlDoc.GetElementsByTagName(mainNode);
            XmlNodeList nodes 
= fatherNode[0].ChildNodes;
            
for (int i = 0; i < nodes.Count; i++)
            {
                
for (int j = 0; j < nodes[i].ChildNodes.Count; j++)
                {
                    
if (nodes[i].ChildNodes[j].Name == node && nodes[i].ChildNodes[j].InnerText.Replace("\r\n","").Trim() == condition)      //根据已有结点信息,查看目标结点是否存在
                    {
                        
for (int k = 0; k < nodes[i].ChildNodes.Count; k++)
                        {
                            
if (nodes[i].ChildNodes[k].Name == childNode)
                            {
                                
return IsHasChildNode = true;
                            }
                        }
                    }
                }
                
            }
            
return IsHasChildNode; 
        }

        
/// <summary>
        
/// 删除指定结点及其所有的子节点(适用于DomainRegex.xml)
        
/// </summary>
        
/// <param name="node">要删除的节点路径</param>
        public bool DeleteNode(string mainNode,string node,string condition)
        {
            
bool IsSuccessful = false;
            XmlNodeList fatherNode 
= xmlDoc.GetElementsByTagName(mainNode);
            XmlNodeList nodes 
= fatherNode[0].ChildNodes;
            
for (int i = 0; i < nodes.Count; i++)
            {
                
for (int j = 0; j < nodes[i].ChildNodes.Count; j++)
                {
                    
if (nodes[i].ChildNodes[j].Name == node && nodes[i].ChildNodes[j].InnerText.Replace("\r\n""").Trim() == condition)      //根据已有结点信息,查看目标结点是否存在
                    {
                        fatherNode[
0].RemoveChild(nodes[i]);
                        IsSuccessful 
= true;
                        
break;
                    }
                }
            }
            
return IsSuccessful;
        }


        


        
/// <summary>
        
/// 从配置文件获取到目标站点的配置信息(DomainRegex.xml)
        
/// </summary>
        
/// <param name="domainAlias">目标站点别名</param>
        
/// <returns></returns>
        public  DomainRegexInfo GetDomainInfo(string domainAlias)
        {
            DomainRegexInfo domainInfo 
= new DomainRegexInfo();
            DataView dv 
= this.GetData("DomainRegexMaps""DomainAlias", domainAlias);
            
if (this.HasChildNode("DomainRegexMaps""DomainAlias", domainAlias, "DomainName"))
            {
                domainInfo.DomainName 
= dv[0].Row["DomainName"].ToString().Replace("\r\n""").Trim();
            }
            
if (this.HasChildNode("DomainRegexMaps""DomainAlias", domainAlias, "DomainAlias"))
            {
                domainInfo.DomainAlias 
= dv[0].Row["DomainAlias"].ToString().Replace("\r\n""").Trim();
            }
            
if (this.HasChildNode("DomainRegexMaps""DomainAlias", domainAlias, "TitlePostfix"))
            {
                domainInfo.TitlePostfix 
= dv[0].Row["TitlePostfix"].ToString().Replace("\r\n""").Trim();
            }
            
if (this.HasChildNode("DomainRegexMaps""DomainAlias", domainAlias, "TitlePrefix"))
            {
                domainInfo.TitlePrefix 
= dv[0].Row["TitlePrefix"].ToString().Replace("\r\n""").Trim();
            }
            
if (this.HasChildNode("DomainRegexMaps""DomainAlias", domainAlias, "ContentPostfix"))
            {
                domainInfo.ContentPostfix 
= dv[0].Row["ContentPostfix"].ToString().Replace("\r\n""").Trim();
            }
            
if (this.HasChildNode("DomainRegexMaps""DomainAlias", domainAlias, "ContentPrefix"))
            {
                domainInfo.ContentPrefix 
= dv[0].Row["ContentPrefix"].ToString().Replace("\r\n""").Trim();
            }
            
if (this.HasChildNode("DomainRegexMaps""DomainAlias", domainAlias, "RequiredString"))
            {
                domainInfo.RequiredString 
= dv[0].Row["RequiredString"].ToString().Replace("\r\n""").Trim();
            }
            
if (this.HasChildNode("DomainRegexMaps""DomainAlias", domainAlias, "ExcludedString"))
            {
                domainInfo.ExcludedString 
= dv[0].Row["ExcludedString"].ToString().Replace("\r\n""").Trim();
            }
            
return domainInfo;
        }



        
#endregion
    }
}
原文地址:https://www.cnblogs.com/gb2013/p/1676567.html