Winform编程总结2—常用的XML读写

简介: 1 using System; 2  using System.Data; 3 using System.Configuration; 4 using System.Web; 5 using System.

 

 
 
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);//显示子节点点文本
    }
   }

作者:Tyler Ning
出处:http://www.cnblogs.com/tylerdonet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过以下邮箱地址williamningdong@gmail.com  联系我,非常感谢。

目录
相关文章
|
1月前
|
XML 安全 API
Python读写XML文件:深入解析与技术实现
Python读写XML文件:深入解析与技术实现
47 0
|
3月前
|
XML JSON JavaScript
XML文件的读写操作详解
XML文件的读写操作详解
32 0
|
4月前
|
XML 存储 JavaScript
【python】DOM模块读写XML文件
【python】DOM模块读写XML文件
23 0
|
4月前
|
XML 存储 前端开发
【python】XML格式文件读写详解
【python】XML格式文件读写详解
29 0
|
10月前
|
XML C# 数据格式
【C#编程最佳实践 四】XML配置文件编写与读取实践
【C#编程最佳实践 四】XML配置文件编写与读取实践
183 0
|
XML 数据处理 数据格式
【XML编程与WEB服务】XML入门
【XML编程与WEB服务】XML入门
103 0
|
XML 存储 JavaScript
编程笔记:XML和HTML初步学习-2
编程笔记:XML和HTML初步学习-2
|
XML 存储 Java
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(四)
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(四)
110 0
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(四)
|
XML Java 数据格式
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(三)
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(三)
127 0
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(三)
|
XML 设计模式 Java
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(二)
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(二)
129 0
【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入(二)