zoukankan      html  css  js  c++  java
  • c#操作XML文件的通用方法

    c#操作XML文件的通用方法

     
    本文导读:我们在编写C#程序时,经常会通过C#访问XML文件,实现对XML文档的读写操作。下面为大家列出了通用的调用方法,大家可以将这些方法放在共用类里,其它的程序共享调用就可以了。

         下面通过一个类将我们平时用c#操作XML文件的通用方法详细的介绍一下,关于asp.net C#操作xml文档实现代码,大家可以参考参考。

     c# 代码
      1                 sing System;
      2 using System.Data;
      3 using System.Configuration;
      4 using System.Web;
      5 using System.Web.Security;
      6 using System.Web.UI;
      7 using System.Web.UI.WebControls;
      8 using System.Web.UI.WebControls.WebParts;
      9 using System.Web.UI.HtmlControls;
     10 using System.Xml;
     11 using System.Collections;
     12 using System.IO;
     13 
     14 
     15 public class XMLHealper
     16 {
     17    构造函数#region 构造函数
     18     public XMLHealper()
     19    {
     20         FilePath = XMLPath.GetXMLPath();
     21         OpenXML();
     22    }
     23    #endregion
     24 
     25    对象定义#region 对象定义
     26 
     27     private XmlDocument xmlDoc = new XmlDocument();
     28    XmlNode xmlnode;
     29    XmlElement xmlelem;
     30 
     31    #endregion
     32 
     33    属性定义#region 属性定义
     34 
     35     private string errorMess;
     36     public string ErrorMess
     37     {
     38         get { return errorMess; }
     39         set { errorMess = value; }
     40     }
     41 
     42     private string filePath;
     43     public string FilePath
     44     {
     45         set { filePath = value; }
     46         get { return filePath; }
     47     }
     48 
     49     #endregion
     50 
     51     加载XML文件,创建操作对象#region 加载XML文件,创建操作对象
     52      /**//// <summary>
     53     /// 加载XML文件,创建操作对象
     54     /// </summary>
     55     public void OpenXML()
     56     {
     57         try
     58         {
     59             if (!string.IsNullOrEmpty(FilePath))
     60             {
     61                 xmlDoc.Load(filePath);
     62             }
     63             else
     64             {
     65                 FilePath = string.Format(@"D:\XMLExample.xml"); //默认路径
     66                 xmlDoc.Load(filePath);
     67             }
     68         }
     69         catch (Exception ex)
     70         {
     71             ErrorMess = ex;
     72         }
     73     }
     74     #endregion
     75 
     76     创建Xml 文档#region 创建Xml 文档
     77     /**//// <summary>
     78     /// 创建一个带有根节点的Xml 文件
     79     /// </summary>
     80     /// <param name="FileName">Xml 文件名称</param>
     81     /// <param name="rootName">根节点名称</param>
     82     /// <param name="Encode">编码方式:gb2312,UTF-8 等常见的</param>
     83     /// <param name="DirPath">保存的目录路径</param>
     84     /// <returns></returns>
     85     public bool CreatexmlDocument(string FileName, string rootName, string Encode)
     86     {
     87         try
     88         {
     89             XmlDeclaration xmldecl;
     90             xmldecl = xmlDoc.CreateXmlDeclaration("1.0", Encode, null);
     91             xmlDoc.AppendChild(xmldecl);
     92             xmlelem = xmlDoc.CreateElement("", rootName, "");
     93             xmlDoc.AppendChild(xmlelem);
     94             xmlDoc.Save(FileName);
     95             return true;
     96         }
     97         catch (Exception e)
     98         {
     99             return false;
    100         }
    101     }
    102     #endregion
    103 
    104     得到数据表#region 得到数据表
    105     /**//// <summary>
    106     /// 得到数据表
    107     /// </summary>
    108     /// <returns></returns>
    109     public DataView GetData()
    110     {
    111         xmlDoc = new XmlDocument();
    112         DataSet ds = new DataSet();
    113         StringReader read = new StringReader(xmlDoc.SelectSingleNode(FilePath).OuterXml);
    114         ds.ReadXml(read);
    115         return ds.Tables[0].DefaultView;
    116     }
    117     #endregion
    118 
    119     读取指定节点的指定属性值#region 读取指定节点的指定属性值
    120     /**//// <summary>
    121     /// 功能:
    122     /// 读取指定节点的指定属性值
    123     /// </summary>
    124     /// <param name="strNode">节点名称(相对路径://+节点名称)</param>
    125     /// <param name="strAttribute">此节点的属性</param>
    126     /// <returns></returns>
    127     public string GetXmlNodeValue(string strNode, string strAttribute)
    128     {
    129         string strReturn = "";
    130         try
    131         {
    132             //根据指定路径获取节点
    133             XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode);
    134             //获取节点的属性,并循环取出需要的属性值
    135             XmlAttributeCollection xmlAttr = xmlNode.Attributes;
    136 
    137             for (int i = 0; i < xmlAttr.Count; i++)
    138             {
    139                 if (xmlAttr.Item(i).Name == strAttribute)
    140                 {
    141                     strReturn = xmlAttr.Item(i).Value;
    142                 }
    143             }
    144         }
    145         catch (XmlException xmle)
    146         {
    147             throw xmle;
    148         }
    149         return strReturn;
    150     }
    151     #endregion
    152 
    153     读取指定节点的值#region 读取指定节点的值
    154     /**//// <summary>
    155     /// 读取指定节点的值
    156     /// </summary>
    157     /// <param name="strNode">节点名称</param>
    158     /// <returns></returns>
    159     public string GetXmlNodeValue(string strNode)
    160     {
    161         string strReturn = String.Empty;
    162         try
    163         {
    164             //根据路径获取节点
    165             XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode);
    166             strReturn = xmlNode.InnerText;
    167         }
    168         catch (XmlException xmle)
    169         {
    170             System.Console.WriteLine(xmle.Message);
    171         }
    172         return strReturn;
    173     }
    174     #endregion
    175 
    176     获取XML文件的根元素#region 获取XML文件的根元素
    177     /**//// <summary>
    178     /// 获取XML文件的根元素
    179     /// </summary>
    180     public XmlNode GetXmlRoot()
    181     {
    182         return xmlDoc.DocumentElement;
    183     }
    184     #endregion
    185 
    186     获取XML节点值#region 获取XML节点值
    187     /**//// <summary>
    188     /// 获取XML节点值
    189     /// </summary>
    190     /// <param name="nodeName"></param>
    191     /// <returns></returns>
    192     public string GetNodeValue(string nodeName)
    193     {
    194         xmlDoc = new XmlDocument();
    195         xmlDoc.Load(FilePath);
    196 
    197         XmlNodeList xnl = xmlDoc.ChildNodes;
    198         foreach (XmlNode xnf in xnl)
    199         {
    200             XmlElement xe = (XmlElement)xnf;
    201             XmlNodeList xnf1 = xe.ChildNodes;
    202             foreach (XmlNode xn2 in xnf1)
    203             {
    204                 if (xn2.InnerText == nodeName)
    205                 {
    206                     XmlElement xe2 = (XmlElement)xn2;
    207                     return xe2.GetAttribute("value");
    208                 }
    209             }
    210         }
    211         return null;
    212     }
    213     #endregion
    214 
    215 
    216     设置节点值#region 设置节点值
    217     /**//// <summary>
    218     /// 功能:
    219     /// 设置节点值
    220     /// </summary>
    221     /// <param name="strNode">节点的名称</param>
    222     /// <param name="newValue">节点值</param>
    223     public void SetXmlNodeValue(string xmlNodePath, string xmlNodeValue)
    224     {
    225         try
    226         {
    227             //根据指定路径获取节点
    228             XmlNode xmlNode = xmlDoc.SelectSingleNode(xmlNodePath);
    229             //设置节点值
    230             xmlNode.InnerText = xmlNodeValue;
    231         }
    232         catch (XmlException xmle)
    233         {
    234             throw xmle;
    235         }
    236     }
    237     #endregion
    238 
    239     添加父节点#region 添加父节点
    240 
    241     /**//// <summary>
    242     /// 在根节点下添加父节点
    243     /// </summary>
    244     public void AddParentNode(string parentNode)
    245     {
    246         XmlNode root = GetXmlRoot();
    247         XmlNode parentXmlNode = xmlDoc.CreateElement(parentNode);
    248 
    249         root.AppendChild(parentXmlNode);
    250     }
    251     #endregion
    252 
    253     向一个已经存在的父节点中插入一个子节点#region 向一个已经存在的父节点中插入一个子节点
    254     /**//// <summary>
    255     /// 向一个已经存在的父节点中插入一个子节点
    256     /// </summary>
    257     public void AddChildNode(string parentNodePath, string childNodePath)
    258     {
    259         XmlNode parentXmlNode = xmlDoc.SelectSingleNode(parentNodePath);
    260         XmlNode childXmlNode = xmlDoc.CreateElement(childNodePath);
    261 
    262         parentXmlNode.AppendChild(childXmlNode);
    263     }
    264     #endregion
    265 
    266     向一个节点添加属性#region 向一个节点添加属性
    267     /**//// <summary>
    268     /// 向一个节点添加属性
    269     /// </summary>
    270     public void AddAttribute(string NodePath, string NodeAttribute)
    271     {
    272         XmlAttribute nodeAttribute = xmlDoc.CreateAttribute(NodeAttribute);
    273         XmlNode nodePath = xmlDoc.SelectSingleNode(NodePath);
    274         nodePath.Attributes.Append(nodeAttribute);
    275     }
    276     #endregion
    277 
    278     插入一个节点和它的若干子节点#region 插入一个节点和它的若干子节点
    279     /**//// <summary>
    280     /// 插入一个节点和它的若干子节点
    281     /// </summary>
    282     /// <param name="NewNodeName">插入的节点名称</param>
    283     /// <param name="HasAttributes">此节点是否具有属性,True 为有,False 为无</param>
    284     /// <param name="fatherNode">此插入节点的父节点</param>
    285     /// <param name="htAtt">此节点的属性,Key 为属性名,Value 为属性值</param>
    286     /// <param name="htSubNode"> 子节点的属性, Key 为Name,Value 为InnerText</param>
    287     /// <returns>返回真为更新成功,否则失败</returns>
    288     public bool InsertNode(string NewNodeName, bool HasAttributes, string fatherNode, Hashtable htAtt, Hashtable htSubNode)
    289     {
    290         try
    291         {
    292             xmlDoc.Load(FilePath);
    293             XmlNode root = xmlDoc.SelectSingleNode(fatherNode);
    294             xmlelem = xmlDoc.CreateElement(NewNodeName);
    295             if (htAtt != null && HasAttributes)//若此节点有属性,则先添加属性
    296             {
    297                 SetAttributes(xmlelem, htAtt);
    298                 AddNodes(xmlelem.Name, xmlDoc, xmlelem, htSubNode);//添加完此节点属性后,再添加它的子节点和它们的InnerText
    299             }
    300             else
    301             {
    302                 AddNodes(xmlelem.Name, xmlDoc, xmlelem, htSubNode);//若此节点无属性,那么直接添加它的子节点
    303             }
    304             root.AppendChild(xmlelem);
    305             xmlDoc.Save(FilePath);
    306             return true;
    307         }
    308         catch (Exception e)
    309         {
    310             throw new Exception(e.Message);
    311         }
    312     }
    313     #endregion
    314 
    315     设置节点属性#region 设置节点属性
    316     /**//// <summary>
    317     /// 设置节点属性
    318     /// </summary>
    319     /// <param name="xe">节点所处的Element</param>
    320     /// <param name="htAttribute">节点属性,Key 代表属性名称,Value 代表属性值</param>
    321     public void SetAttributes(XmlElement xe, Hashtable htAttribute)
    322     {
    323         foreach (DictionaryEntry de in htAttribute)
    324         {
    325             xe.SetAttribute(de.Key.ToString(), de.Value.ToString());
    326         }
    327     }
    328     #endregion
    329 
    330     增加子节点到根节点下#region 增加子节点到根节点下
    331     /**//// <summary>
    332     /// 增加子节点到根节点下
    333     /// </summary>
    334     /// <param name="rootNode">上级节点名称</param>
    335     /// <param name="xmlDoc">Xml 文档</param>
    336     /// <param name="rootXe">父根节点所属的Element</param>
    337     /// <param name="SubNodes">子节点属性,Key 为Name 值,Value 为InnerText 值</param>
    338     public void AddNodes(string rootNode, XmlDocument xmlDoc, XmlElement rootXe, Hashtable SubNodes)
    339     {
    340         foreach (DictionaryEntry de in SubNodes)
    341         {
    342             xmlnode = xmlDoc.SelectSingleNode(rootNode);
    343             XmlElement subNode = xmlDoc.CreateElement(de.Key.ToString());
    344             subNode.InnerText = de.Value.ToString();
    345             rootXe.AppendChild(subNode);
    346         }
    347     }
    348     #endregion
    349 
    350     //更新
    351 
    352     设置节点的属性值#region 设置节点的属性值
    353     /**//// <summary>
    354     /// 功能:
    355     /// 设置节点的属性值
    356     /// </summary>
    357     /// <param name="xmlNodePath">节点名称</param>
    358     /// <param name="xmlNodeAttribute">属性名称</param>
    359     /// <param name="xmlNodeAttributeValue">属性值</param>
    360     public void SetXmlNodeValue(string xmlNodePath, string xmlNodeAttribute, string xmlNodeAttributeValue)
    361     {
    362         try
    363         {
    364             //根据指定路径获取节点
    365             XmlNode xmlNode = xmlDoc.SelectSingleNode(xmlNodePath);
    366 
    367             //获取节点的属性,并循环取出需要的属性值
    368             XmlAttributeCollection xmlAttr = xmlNode.Attributes;
    369             for (int i = 0; i < xmlAttr.Count; i++)
    370             {
    371                 if (xmlAttr.Item(i).Name == xmlNodeAttribute)
    372                 {
    373                     xmlAttr.Item(i).Value = xmlNodeAttributeValue;
    374                     break;
    375                 }
    376             }
    377         }
    378         catch (XmlException xmle)
    379         {
    380             throw xmle;
    381         }
    382     }
    383 
    384     #endregion
    385 
    386     更新节点#region 更新节点
    387     /**//// <summary>
    388     /// 更新节点
    389     /// </summary>
    390     /// <param name="fatherNode">需要更新节点的上级节点</param>
    391     /// <param name="htAtt">需要更新的属性表,Key 代表需要更新的属性,Value 代表更新后的值</param>
    392     /// <param name="htSubNode">需要更新的子节点的属性表,Key 代表需要更新的子节点名字Name,Value 代表更新后的值InnerText</param>
    393     /// <returns>返回真为更新成功,否则失败</returns>
    394     public bool UpdateNode(string fatherNode, Hashtable htAtt, Hashtable htSubNode)
    395     {
    396         try
    397         {
    398             xmlDoc = new XmlDocument();
    399             xmlDoc.Load(FilePath);
    400             XmlNodeList root = xmlDoc.SelectSingleNode(fatherNode).ChildNodes;
    401             UpdateNodes(root, htAtt, htSubNode);
    402             xmlDoc.Save(FilePath);
    403             return true;
    404         }
    405         catch (Exception e)
    406         {
    407             throw new Exception(e.Message);
    408         }
    409     }
    410     #endregion
    411 
    412     更新节点属性和子节点InnerText 值#region 更新节点属性和子节点InnerText 值
    413     /**//// <summary>
    414     /// 更新节点属性和子节点InnerText 值
    415     /// </summary>
    416     /// <param name="root">根节点名字</param>
    417     /// <param name="htAtt">需要更改的属性名称和值</param>
    418     /// <param name="htSubNode">需要更改InnerText 的子节点名字和值</param>
    419     public void UpdateNodes(XmlNodeList root, Hashtable htAtt, Hashtable htSubNode)
    420     {
    421         foreach (XmlNode xn in root)
    422         {
    423             xmlelem = (XmlElement)xn;
    424             if (xmlelem.HasAttributes)//如果节点如属性,则先更改它的属性
    425             {
    426                 foreach (DictionaryEntry de in htAtt)//遍历属性哈希表
    427                 {
    428                     if (xmlelem.HasAttribute(de.Key.ToString()))//如果节点有需要更改的属性
    429                     {
    430                         xmlelem.SetAttribute(de.Key.ToString(), de.Value.ToString());//则把哈希表中相应的值Value 赋给此属性Key
    431                     }
    432                 }
    433             }
    434             if (xmlelem.HasChildNodes)//如果有子节点,则修改其子节点的InnerText
    435             {
    436                 XmlNodeList xnl = xmlelem.ChildNodes;
    437                 foreach (XmlNode xn1 in xnl)
    438                 {
    439                     XmlElement xe = (XmlElement)xn1;
    440                     foreach (DictionaryEntry de in htSubNode)
    441                     {
    442                         if (xe.Name == de.Key.ToString())//htSubNode 中的key 存储了需要更改的节点名称,
    443                         {
    444                             xe.InnerText = de.Value.ToString();//htSubNode中的Value存储了Key 节点更新后的数据
    445                         }
    446                     }
    447                 }
    448             }
    449         }
    450     }
    451     #endregion
    452 
    453 
    454     删除一个节点的属性#region 删除一个节点的属性
    455     /**//// <summary>
    456     /// 删除一个节点的属性
    457     /// </summary>
    458     public void DeleteAttribute(string NodePath, string NodeAttribute, string NodeAttributeValue)
    459     {
    460         XmlNodeList nodePath = xmlDoc.SelectSingleNode(NodePath).ChildNodes;
    461 
    462         foreach (XmlNode xn in nodePath)
    463         {
    464             XmlElement xe = (XmlElement)xn;
    465 
    466             if (xe.GetAttribute(NodeAttribute) == NodeAttributeValue)
    467             {
    468                 xe.RemoveAttribute(NodeAttribute);//删除属性
    469             }
    470         }
    471     }
    472 
    473     #endregion
    474 
    475     删除一个节点#region 删除一个节点
    476     /**//// <summary>
    477     /// 删除一个节点
    478     /// </summary>
    479     public void DeleteXmlNode(string tempXmlNode)
    480     {
    481         XmlNode xmlNodePath = xmlDoc.SelectSingleNode(tempXmlNode);
    482         xmlNodePath.ParentNode.RemoveChild(xmlNodePath);
    483     }
    484 
    485     #endregion
    486 
    487     删除指定节点下的子节点#region 删除指定节点下的子节点
    488     /**//// <summary>
    489     /// 删除指定节点下的子节点
    490     /// </summary>
    491     /// <param name="fatherNode">制定节点</param>
    492     /// <returns>返回真为更新成功,否则失败</returns>
    493     public bool DeleteNodes(string fatherNode)
    494     {
    495         try
    496         {
    497             xmlDoc = new XmlDocument();
    498             xmlDoc.Load(FilePath);
    499             xmlnode = xmlDoc.SelectSingleNode(fatherNode);
    500             xmlnode.RemoveAll();
    501             xmlDoc.Save(FilePath);
    502             return true;
    503         }
    504         catch (XmlException xe)
    505         {
    506             throw new XmlException(xe.Message);
    507         }
    508     }
    509     #endregion
    510 
    511 
    512     私有函数#region 私有函数
    513 
    514     private string functionReturn(XmlNodeList xmlList, int i, string nodeName)
    515     {
    516         string node = xmlList[i].ToString();
    517         string rusultNode = "";
    518         for (int j = 0; j < i; j++)
    519         {
    520             if (node == nodeName)
    521             {
    522                 rusultNode = node.ToString();
    523             }
    524             else
    525             {
    526                 if (xmlList[j].HasChildNodes)
    527                 {
    528                     functionReturn(xmlList, j, nodeName);
    529                 }
    530                 else
    531                 {
    532                     break;
    533                 }
    534             }
    535         }
    536         return rusultNode;
    537 
    538 
    539     }
    540 
    541     #endregion
    542 
    543     保存XML文件#region 保存XML文件
    544     /**//// <summary>
    545     /// 功能: 
    546     /// 保存XML文件
    547     /// 
    548     /// </summary>
    549     public void SavexmlDocument()
    550     {
    551         try
    552         {
    553             xmlDoc.Save(FilePath);
    554         }
    555         catch (XmlException xmle)
    556         {
    557             throw xmle;
    558         }
    559     }
    560     /**//// <summary>
    561     /// 功能: 保存XML文件
    562     /// </summary>
    563     /// <param name="tempXMLFilePath"></param>
    564     public void SavexmlDocument(string tempXMLFilePath)
    565     {
    566         try
    567         {
    568             xmlDoc.Save(tempXMLFilePath);
    569         }
    570         catch (XmlException xmle)
    571         {
    572             throw xmle;
    573         }
    574     }
    575     #endregion
    576 }
    577 
    578             
    View Code
  • 相关阅读:
    HTTP 方法
    Nodejs 使用 bcrypt 库加密和验证密码
    Flutter 获取本地图片并剪切
    Flutter: 矩形边框
    [bzoj1385]Division expression
    项目中常用方法总结(将将DataTable数据集映射到实体对象)【转】
    hdu1010:Tempter of the Bone(dfs)
    hdu1010:Tempter of the Bone(dfs)
    BZOJ 2820 YY的GCD
    算法的封装与切换—策略模式(四)
  • 原文地址:https://www.cnblogs.com/omg24/p/4288523.html
Copyright © 2011-2022 走看看