WinForm编程之XML读写

来源:互联网 发布:java算法相关书籍 编辑:程序博客网 时间:2024/06/18 00:07
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;
10using 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 = newXmlDocument();
25
26        /// <summary>
27        /// 构造函数,导入Xml文件
28        /// </summary>
29        /// <paramname="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        /// <paramname="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        /// <paramname="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        /// <paramname="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 = newSystem.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        /// <paramname="XmlPathNode">属性所在的节点</param>
98        /// <paramname="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        /// <paramname="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        /// <paramname="XmlPathNode">父节点</param>
130        /// <paramname="index">节点索引</param>
131        /// <paramname="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 (inti = 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        /// <paramname="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        /// <paramname="XmlPathNode">节点的路径</param>
177        /// <paramname="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        /// <paramname="XmlParentNode">父节点</param>
196        /// <paramname="XmlNode">子节点</param>
197        /// <paramname="NodeContent">子节点内容</param>
198        /// <returns></returns>
199        public bool UpdateNode(string XmlParentNode, string[]XmlNode, string[]NodeContent)
200                    
201            try
202            {
203                //根据节点数组循环修改节点值
204                for (inti = 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        /// <paramname="XmlPathNode">属性所在的节点</param>
220        /// <paramname="Attrib">属性名</param>
221        /// <paramname="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        /// <paramname="MainNode">属性所在节点</param>
242        /// <paramname="Attrib">属性名</param>
243        /// <paramname="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        /// <paramname="MainNode">插入节点的父节点</param>
264        /// <paramname="ChildNode">插入节点的元素名</param>
265        /// <paramname="Element">插入节点的子节点名数组</param>
266        /// <paramname="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_x(ChildNode); //创建XmlElement对象
274                objRootNode.A(objChildNode); 
275                for (inti = 0; i< Element.Length; i++  //循环插入节点元素
276                {
277                    XmlElement objElement =XmlDoc.createElement_x(Element[i]);
278                   objElement.InnerText =Content[i];
279                    objChildNode.A(objElement);
280                }
281                return true;
282            }
283            catch
284            {
285                return false;
286            }
287        }
288
289        /// <summary>
290        /// 删除一个节点
291        /// </summary>
292        /// <paramname="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)如下:
<?xmlversion="1.0" encoding="gb2312"?>
<bookstore>
  <book genre="fantasy"ISBN="2-3631-4">
   <title>Oberon'sLegacy</title>
   <author>Corets,Eva</author>
   <price>5.95</price>
  </book>
</bookstore>
 
1、往<bookstore>节点中插入一个<book>节点:
   XmlDocumentxmlDoc=new XmlDocument();
   xmlDoc.Load("bookstore.xml");
   XmlNoderoot=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore>
   XmlElementxe1=xmlDoc.createElement_x("book");//创建一个<book>节点
   xe1.SetAttribute("genre","李赞红");//设置该节点genre属性
   xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性
 
   XmlElementxesub1=xmlDoc.createElement_x("title");
   xesub1.InnerText="CS从入门到精通";//设置文本节点
   xe1.A(xesub1);//添加到<book>节点中
   XmlElementxesub2=xmlDoc.createElement_x("author");
   xesub2.InnerText="候捷";
   xe1.A(xesub2);
   XmlElementxesub3=xmlDoc.createElement_x("price");
   xesub3.InnerText="58.3";
   xe1.A(xesub3);
 
   root.A(xe1);//添加到<bookstore>节点中
   xmlDoc.Save("bookstore.xml");
//===============================================
结果为:
<?xmlversion="1.0" encoding="gb2312"?>
<bookstore>
  <book genre="fantasy"ISBN="2-3631-4">
   <title>Oberon'sLegacy</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>的文本修改为“亚胜”。
    XmlNodeListnodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;//获取bookstore节点的所有子节点
   foreach(XmlNodexn in nodeList)//遍历所有子节点
   {
    XmlElementxe=(XmlElement)xn;//将子节点类型转换为XmlElement类型
    if(xe.GetAttribute("genre")=="李赞红")//如果genre属性值为“李赞红”
    {
     xe.SetAttribute("genre","update李赞红");//则修改该属性为“update李赞红”
 
     XmlNodeListnls=xe.ChildNodes;//继续获取xe子节点的所有子节点
     foreach(XmlNodexn1 in nls)//遍历
     {
      XmlElementxe2=(XmlElement)xn1;//转换类型
      if(xe2.Name=="author")//如果找到
      {
       xe2.InnerText="亚胜";//则修改
       break;//找到退出来就可以了
      }
     }
     break;
    }
   }
 
   xmlDoc.Save("bookstore.xml");//保存。
//==================================================
最后结果为:
<?xmlversion="1.0" encoding="gb2312"?>
<bookstore>
  <book genre="fantasy"ISBN="2-3631-4">
   <title>Oberon'sLegacy</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、删除 <bookgenre="fantasy" ISBN="2-3631-4">节点的genre属性,删除<book genre="update李赞红"ISBN="2-3631-4">节点。
XmlNodeListxnl=xmlDoc.SelectSingleNode("bookstore").ChildNodes;
 
   foreach(XmlNodexn in xnl)
   {
    XmlElementxe=(XmlElement)xn;
    if(xe.GetAttribute("genre")=="fantasy")
    {
     xe.RemoveAttribute("genre");//删除genre属性
    }
    elseif(xe.GetAttribute("genre")=="update李赞红")
    {
     xe.RemoveAll();//删除该节点的全部内容
    }
   }
   xmlDoc.Save("bookstore.xml");
//===========================================
最后结果为:
<?xmlversion="1.0" encoding="gb2312"?>
<bookstore>
  <bookISBN="2-3631-4">
   <title>Oberon'sLegacy</title>
   <author>Corets,Eva</author>
   <price>5.95</price>
  </book>
  <book>
  </book>
</bookstore>
 
4、显示所有数据。
   XmlNodexn=xmlDoc.SelectSingleNode("bookstore");
 
   XmlNodeListxnl=xn.ChildNodes;
   
   foreach(XmlNodexnf in xnl)
   {
    XmlElementxe=(XmlElement)xnf;
    Console.WriteLine(xe.GetAttribute("genre"));//显示属性值
    Console.WriteLine(xe.GetAttribute("ISBN"));
 
    XmlNodeListxnf1=xe.ChildNodes;
    foreach(XmlNodexn2 in xnf1)
    {
     Console.WriteLine(xn2.InnerText);//显示子节点点文本
    }
   }
 
 
转自:http://www.cnblogs.com/tylerdonet/archive/2010/12/16/1908691.html
 
0 0