• 常用的XML读写


    1 using 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.Collections;
    11
    12 //引用命名空间
    13 using System.Xml;
    14  
    16 namespace xmlOp
    17 {
    18 /// <summary>
    19 /// XmlOp类提供对XML数据库的读写
    20 /// </summary>
    21 public class XmlOp
    22 {
    23 //声明一个XmlDocument空对象
    24 protected XmlDocument XmlDoc = new XmlDocument();
    25
    26 /// <summary>
    27 /// 构造函数,导入Xml文件
    28 /// </summary>
    29 /// <param name="xmlFile">文件虚拟路径</param>
    30 public XmlOp(string xmlFile)
    31 {
    32 try
    33 {
    34 XmlDoc.Load(GetXmlFilePath(xmlFile)); //载入Xml文档
    35 }
    36 catch (System.Exception ex)
    37 {
    38 throw ex;
    39 }
    40 }
    41 /// <summary>
    42 /// 析构函数
    43 /// </summary>
    44 ~XmlOp()
    45 {
    46 XmlDoc = null; //释放XmlDocument对象
    47 }
    48
    49 /// <summary>
    50 /// 保存文件
    51 /// </summary>
    52 /// <param name="filePath">文件虚拟路径</param>
    53 public void Save(string filePath)
    54 {
    55 try
    56 {
    57 XmlDoc.Save(GetXmlFilePath(filePath));
    58 }
    59 catch (System.Exception ex)
    60 {
    61 throw ex;
    62 }
    63 }
    64
    65 /// <summary>
    66 /// 返回Xml文件实际路径
    67 /// </summary>
    68 /// <param name="xmlFile">文件虚拟路径</param>
    69 /// <returns></returns>
    70 public string GetXmlFilePath(string xmlFile)
    71 {
    72 return HttpContext.Current.Server.MapPath(xmlFile);
    73 }
    74
    75 /// <summary>
    76 /// 根据Xml文件的节点路径,返回一个DataSet数据集
    77 /// </summary>
    78 /// <param name="XmlPathNode">Xml文件的某个节点</param>
    79 /// <returns></returns>
    80 public DataSet GetDs(string XmlPathNode)
    81 {
    82 DataSet ds = new DataSet();
    83 try
    84 {
    85 System.IO.StringReader read = new System.IO.StringReader(XmlDoc.SelectSingleNode(XmlPathNode).OuterXml);
    86 ds.ReadXml(read); //利用DataSet的ReadXml方法读取StringReader文件流
    87 read.Close();
    88 }
    89 catch
    90 { }
    91 return ds;
    92 }
    93
    94 /// <summary>
    95 /// 属性查询,返回属性值
    96 /// </summary>
    97 /// <param name="XmlPathNode">属性所在的节点</param>
    98 /// <param name="Attrib">属性</param>
    99 /// <returns></returns>
    100 public string SelectAttrib(string XmlPathNode, string Attrib)
    101 {
    102 string _strNode="";
    103 try
    104 {
    105 _strNode = XmlDoc.SelectSingleNode(XmlPathNode).Attributes[Attrib].Value;
    106 }
    107 catch
    108 { }
    109 return _strNode;
    110 }
    111
    112 /// <summary>
    113 /// 节点查询,返回节点值
    114 /// </summary>
    115 /// <param name="XmlPathNode">节点的路径</param>
    116 /// <returns></returns>
    117 public string SelectNodeText(string XmlPathNode)
    118 {
    119 string _nodeTxt = XmlDoc.SelectSingleNode(XmlPathNode).InnerText;
    120 if (_nodeTxt == null || _nodeTxt == "")
    121 return "";
    122 else
    123 return _nodeTxt;
    124 }
    125
    126 /// <summary>
    127 /// 节点值查询判断
    128 /// </summary>
    129 /// <param name="XmlPathNode">父节点</param>
    130 /// <param name="index">节点索引</param>
    131 /// <param name="NodeText">节点值</param>
    132 /// <returns></returns>
    133 public bool SelectNode(string XmlPathNode, int index, string NodeText)
    134 {
    135 try
    136 {
    137 XmlNodeList _NodeList = XmlDoc.SelectNodes(XmlPathNode);
    138 //循环遍历节点,查询是否存在该节点
    139 for (int i = 0; i < _NodeList.Count; i++)
    140 {
    141 if (_NodeList[i].ChildNodes[index].InnerText == NodeText)
    142 {
    143 return true;
    144 break;
    145 }
    146 }
    147 }
    148 catch
    149 {
    150 }
    151 return false;
    152 }
    153
    154 /// <summary>
    155 /// 获取子节点个数
    156 /// </summary>
    157 /// <param name="XmlPathNode">父节点</param>
    158 /// <returns></returns>
    159 public int NodeCount(string XmlPathNode)
    160 {
    161 int i = 0;
    162 try
    163 {
    164 i=XmlDoc.SelectSingleNode(XmlPathNode).ChildNodes.Count;
    165 }
    166 catch
    167 {
    168 i=0;
    169 }
    170 return i;
    171 }
    172
    173 /// <summary>
    174 /// 更新一个节点的内容
    175 /// </summary>
    176 /// <param name="XmlPathNode">节点的路径</param>
    177 /// <param name="Content">新的节点值</param>
    178 /// <returns></returns>
    179 public bool UpdateNode(string XmlPathNode,string NodeContent)
    180 {
    181 try
    182 {
    183 XmlDoc.SelectSingleNode(XmlPathNode).InnerText = NodeContent;
    184 return true;
    185 }
    186 catch
    187 {
    188 return false;
    189 }
    190 }
    191
    192 /// <summary>
    193 /// 更新N个节点值
    194 /// </summary>
    195 /// <param name="XmlParentNode">父节点</param>
    196 /// <param name="XmlNode">子节点</param>
    197 /// <param name="NodeContent">子节点内容</param>
    198 /// <returns></returns>
    199 public bool UpdateNode(string XmlParentNode, string[] XmlNode, string[] NodeContent)
    200 {
    201 try
    202 {
    203 //根据节点数组循环修改节点值
    204 for (int i = 0; i < XmlNode.Length; i++)
    205 {
    206 XmlDoc.SelectSingleNode(XmlParentNode+"/"+XmlNode[i]).InnerText = NodeContent[i];
    207 }
    208 return true;
    209 }
    210 catch
    211 {
    212 return false;
    213 }
    214 }
    215
    216 /// <summary>
    217 /// 修改属性
    218 /// </summary>
    219 /// <param name="XmlPathNode">属性所在的节点</param>
    220 /// <param name="Attrib">属性名</param>
    221 /// <param name="Content">属性值</param>
    222 /// <returns></returns>
    223 public bool UpdateAttrib(string XmlPathNode, string Attrib,string AttribContent)
    224 {
    225 try
    226 {
    227 //修改属性值
    228 XmlDoc.SelectSingleNode(XmlPathNode).Attributes[Attrib].Value = AttribContent;
    229 return true;
    230 }
    231 catch
    232 {
    233 return false;
    234 }
    235 }
    236
    238 /// <summary>
    239 /// 添加属性
    240 /// </summary>
    241 /// <param name="MainNode">属性所在节点</param>
    242 /// <param name="Attrib">属性名</param>
    243 /// <param name="AttribContent">属性值</param>
    244 /// <returns></returns>
    245 public bool InsertAttrib(string MainNode,string Attrib, string AttribContent)
    246 {
    247 try
    248 {
    249 XmlElement objNode = (XmlElement)XmlDoc.SelectSingleNode(MainNode); //强制转化成XmlElement对象
    250 objNode.SetAttribute(Attrib, AttribContent); //XmlElement对象添加属性方法
    251 return true;
    252 }
    253 catch
    254 {
    255 return false;
    256 }
    257 }
    258
    260 /// <summary>
    261 /// 插入一个节点,带N个子节点
    262 /// </summary>
    263 /// <param name="MainNode">插入节点的父节点</param>
    264 /// <param name="ChildNode">插入节点的元素名</param>
    265 /// <param name="Element">插入节点的子节点名数组</param>
    266 /// <param name="Content">插入节点的子节点内容数组</param>
    267 /// <returns></returns>
    268 public bool InsertNode(string MainNode, string ChildNode, string[] Element, string[] Content)
    269 {
    270 try
    271 {
    272 XmlNode objRootNode = XmlDoc.SelectSingleNode(MainNode); //声明XmlNode对象
    273 XmlElement objChildNode = XmlDoc.CreateElement(ChildNode); //创建XmlElement对象
    274 objRootNode.AppendChild(objChildNode);
    275 for (int i = 0; i < Element.Length; i++) //循环插入节点元素
    276 {
    277 XmlElement objElement = XmlDoc.CreateElement(Element[i]);
    278 objElement.InnerText = Content[i];
    279 objChildNode.AppendChild(objElement);
    280 }
    281 return true;
    282 }
    283 catch
    284 {
    285 return false;
    286 }
    287 }
    288
    289 /// <summary>
    290 /// 删除一个节点
    291 /// </summary>
    292 /// <param name="Node">要删除的节点</param>
    293 /// <returns></returns>
    294 public bool DeleteNode(string Node)
    295 {
    296 try
    297 {
    298 //XmlNode的RemoveChild方法来删除节点及其所有子节点
    299 XmlDoc.SelectSingleNode(Node).ParentNode.RemoveChild(XmlDoc.SelectSingleNode(Node));
    300 return true;
    301 }
    302 catch
    303 {
    304 return false;
    305 }
    306 }
    307 }
    308 }
    309

    园子里面有类似的代码http://www.cnblogs.com/somesongs/archive/2009/01/22/xmlhelper.html,不过这个没有给出具体方法体,所以没法看到释放资源的那块,本来就是想看看怎么处理性能问题的。下面是一些具体例子。

    已知有一个XML文件(bookstore.xml)如下:
    <?xml version="1.0" encoding="gb2312"?>
    <bookstore>
      <book genre="fantasy" ISBN="2-3631-4">
        <title>Oberon's Legacy</title>
        <author>Corets, Eva</author>
        <price>5.95</price>
      </book>
    </bookstore>
     
    1、往<bookstore>节点中插入一个<book>节点:
       XmlDocument xmlDoc=new XmlDocument();
       xmlDoc.Load("bookstore.xml");
       XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore>
       XmlElement xe1=xmlDoc.CreateElement("book");//创建一个<book>节点
       xe1.SetAttribute("genre","李赞红");//设置该节点genre属性
       xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性
     
       XmlElement xesub1=xmlDoc.CreateElement("title");
       xesub1.InnerText="CS从入门到精通";//设置文本节点
       xe1.AppendChild(xesub1);//添加到<book>节点中
       XmlElement xesub2=xmlDoc.CreateElement("author");
       xesub2.InnerText="候捷";
       xe1.AppendChild(xesub2);
       XmlElement xesub3=xmlDoc.CreateElement("price");
       xesub3.InnerText="58.3";
       xe1.AppendChild(xesub3);
     
       root.AppendChild(xe1);//添加到<bookstore>节点中
       xmlDoc.Save("bookstore.xml");
    //===============================================
    结果为:
    <?xml version="1.0" encoding="gb2312"?>
    <bookstore>
      <book genre="fantasy" ISBN="2-3631-4">
        <title>Oberon's Legacy</title>
        <author>Corets, Eva</author>
        <price>5.95</price>
      </book>
      <book genre="李赞红" ISBN="2-3631-4">
        <title>CS从入门到精通</title>
        <author>候捷</author>
        <price>58.3</price>
      </book>
    </bookstore>
     
    2、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点<author>的文本修改为“亚胜”。
        XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;//获取bookstore节点的所有子节点
       foreach(XmlNode xn in nodeList)//遍历所有子节点
       {
        XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型
        if(xe.GetAttribute("genre")=="李赞红")//如果genre属性值为“李赞红”
        {
         xe.SetAttribute("genre","update李赞红");//则修改该属性为“update李赞红”
     
         XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点
         foreach(XmlNode xn1 in nls)//遍历
         {
          XmlElement xe2=(XmlElement)xn1;//转换类型
          if(xe2.Name=="author")//如果找到
          {
           xe2.InnerText="亚胜";//则修改
           break;//找到退出来就可以了
          }
         }
         break;
        }
       }
     
       xmlDoc.Save("bookstore.xml");//保存。
    //==================================================
    最后结果为:
    <?xml version="1.0" encoding="gb2312"?>
    <bookstore>
      <book genre="fantasy" ISBN="2-3631-4">
        <title>Oberon's Legacy</title>
        <author>Corets, Eva</author>
        <price>5.95</price>
      </book>
      <book genre="update李赞红" ISBN="2-3631-4">
        <title>CS从入门到精通</title>
        <author>亚胜</author>
        <price>58.3</price>
      </book>
    </bookstore>
     
    3、删除 <book genre="fantasy" ISBN="2-3631-4">节点的genre属性,删除 <book genre="update李赞红" ISBN="2-3631-4">节点。
    XmlNodeList xnl=xmlDoc.SelectSingleNode("bookstore").ChildNodes;
     
       foreach(XmlNode xn in xnl)
       {
        XmlElement xe=(XmlElement)xn;
        if(xe.GetAttribute("genre")=="fantasy")
        {
         xe.RemoveAttribute("genre");//删除genre属性
        }
        else if(xe.GetAttribute("genre")=="update李赞红")
        {
         xe.RemoveAll();//删除该节点的全部内容
        }
       }
       xmlDoc.Save("bookstore.xml");
    //===========================================
    最后结果为:
    <?xml version="1.0" encoding="gb2312"?>
    <bookstore>
      <book ISBN="2-3631-4">
        <title>Oberon's Legacy</title>
        <author>Corets, Eva</author>
        <price>5.95</price>
      </book>
      <book>
      </book>
    </bookstore>
     
    4、显示所有数据。
       XmlNode xn=xmlDoc.SelectSingleNode("bookstore");
     
       XmlNodeList xnl=xn.ChildNodes;
       
       foreach(XmlNode xnf in xnl)
       {
        XmlElement xe=(XmlElement)xnf;
        Console.WriteLine(xe.GetAttribute("genre"));//显示属性值
        Console.WriteLine(xe.GetAttribute("ISBN"));
     
        XmlNodeList xnf1=xe.ChildNodes;
        foreach(XmlNode xn2 in xnf1)
        {
         Console.WriteLine(xn2.InnerText);//显示子节点点文本
        }
       }
  • 相关阅读:
    一个很诡异的javascript问题
    记录我开发鞋服行业供应链软件的历程<设计业务层>
    为什么要自已写报表中心
    关于系统的性能
    “时间”都去哪儿了?性能调优分析方法与案例详解
    工程师推荐软件
    终于有人把云计算、大数据和人工智能讲明白了!
    C# Dictionary 泛型字典集合(转)
    DEV中的TreeList控件应用的一个小效果实现
    推荐VS2008插件CodeRush Xpress for C#
  • 原文地址:https://www.cnblogs.com/ghfsusan/p/2013749.html
Copyright © 2020-2023  润新知