Winform編程總結(jié)2—常用的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數(shù)據(jù)庫的讀寫
20 /// </summary>
21 public class XmlOp
22 {
23 //聲明一個XmlDocument空對象
24 protected XmlDocument XmlDoc = new XmlDocument();
25
26 /// <summary>
27 /// 構(gòu)造函數(shù),導(dǎo)入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 /// 析構(gòu)函數(shù)
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 /// 根據(jù)Xml文件的節(jié)點路徑,返回一個DataSet數(shù)據(jù)集
77 /// </summary>
78 /// <param name="XmlPathNode">Xml文件的某個節(jié)點</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">屬性所在的節(jié)點</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 /// 節(jié)點查詢,返回節(jié)點值
114 /// </summary>
115 /// <param name="XmlPathNode">節(jié)點的路徑</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 /// 節(jié)點值查詢判斷
128 /// </summary>
129 /// <param name="XmlPathNode">父節(jié)點</param>
130 /// <param name="index">節(jié)點索引</param>
131 /// <param name="NodeText">節(jié)點值</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 //循環(huán)遍歷節(jié)點,查詢是否存在該節(jié)點
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 /// 獲取子節(jié)點個數(shù)
156 /// </summary>
157 /// <param name="XmlPathNode">父節(jié)點</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 /// 更新一個節(jié)點的內(nèi)容
175 /// </summary>
176 /// <param name="XmlPathNode">節(jié)點的路徑</param>
177 /// <param name="Content">新的節(jié)點值</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個節(jié)點值
194 /// </summary>
195 /// <param name="XmlParentNode">父節(jié)點</param>
196 /// <param name="XmlNode">子節(jié)點</param>
197 /// <param name="NodeContent">子節(jié)點內(nèi)容</param>
198 /// <returns></returns>
199 public bool UpdateNode(string XmlParentNode, string[] XmlNode, string[] NodeContent)
200 {
201 try
202 {
203 //根據(jù)節(jié)點數(shù)組循環(huán)修改節(jié)點值
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">屬性所在的節(jié)點</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">屬性所在節(jié)點</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); //強制轉(zhuǎn)化成XmlElement對象
250 objNode.SetAttribute(Attrib, AttribContent); //XmlElement對象添加屬性方法
251 return true;
252 }
253 catch
254 {
255 return false;
256 }
257 }
258
260 /// <summary>
261 /// 插入一個節(jié)點,帶N個子節(jié)點
262 /// </summary>
263 /// <param name="MainNode">插入節(jié)點的父節(jié)點</param>
264 /// <param name="ChildNode">插入節(jié)點的元素名</param>
265 /// <param name="Element">插入節(jié)點的子節(jié)點名數(shù)組</param>
266 /// <param name="Content">插入節(jié)點的子節(jié)點內(nèi)容數(shù)組</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); //創(chuàng)建XmlElement對象
274 objRootNode.AppendChild(objChildNode);
275 for (int i = 0; i < Element.Length; i++) //循環(huán)插入節(jié)點元素
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 /// 刪除一個節(jié)點
291 /// </summary>
292 /// <param name="Node">要刪除的節(jié)點</param>
293 /// <returns></returns>
294 public bool DeleteNode(string Node)
295 {
296 try
297 {
298 //XmlNode的RemoveChild方法來刪除節(jié)點及其所有子節(jié)點
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.rzrgm.cn/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>
<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>節(jié)點中插入一個<book>節(jié)點:
XmlDocument xmlDoc=new XmlDocument();
xmlDoc.Load("bookstore.xml");
xmlDoc.Load("bookstore.xml");
XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore>
XmlElement xe1=xmlDoc.CreateElement("book");//創(chuàng)建一個<book>節(jié)點
xe1.SetAttribute("genre","李贊紅");//設(shè)置該節(jié)點genre屬性
xe1.SetAttribute("ISBN","2-3631-4");//設(shè)置該節(jié)點ISBN屬性
XmlElement xe1=xmlDoc.CreateElement("book");//創(chuàng)建一個<book>節(jié)點
xe1.SetAttribute("genre","李贊紅");//設(shè)置該節(jié)點genre屬性
xe1.SetAttribute("ISBN","2-3631-4");//設(shè)置該節(jié)點ISBN屬性
XmlElement xesub1=xmlDoc.CreateElement("title");
xesub1.InnerText="CS從入門到精通";//設(shè)置文本節(jié)點
xe1.AppendChild(xesub1);//添加到<book>節(jié)點中
XmlElement xesub2=xmlDoc.CreateElement("author");
xesub2.InnerText="候捷";
xe1.AppendChild(xesub2);
XmlElement xesub3=xmlDoc.CreateElement("price");
xesub3.InnerText="58.3";
xe1.AppendChild(xesub3);
xesub1.InnerText="CS從入門到精通";//設(shè)置文本節(jié)點
xe1.AppendChild(xesub1);//添加到<book>節(jié)點中
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>節(jié)點中
xmlDoc.Save("bookstore.xml");
xmlDoc.Save("bookstore.xml");
//===============================================
結(jié)果為:
<?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>
<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、修改節(jié)點:將genre屬性值為“李贊紅“的節(jié)點的genre值改為“update李贊紅”,將該節(jié)點的子節(jié)點<author>的文本修改為“亞勝”。
XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;//獲取bookstore節(jié)點的所有子節(jié)點
foreach(XmlNode xn in nodeList)//遍歷所有子節(jié)點
{
XmlElement xe=(XmlElement)xn;//將子節(jié)點類型轉(zhuǎn)換為XmlElement類型
if(xe.GetAttribute("genre")=="李贊紅")//如果genre屬性值為“李贊紅”
{
xe.SetAttribute("genre","update李贊紅");//則修改該屬性為“update李贊紅”
foreach(XmlNode xn in nodeList)//遍歷所有子節(jié)點
{
XmlElement xe=(XmlElement)xn;//將子節(jié)點類型轉(zhuǎn)換為XmlElement類型
if(xe.GetAttribute("genre")=="李贊紅")//如果genre屬性值為“李贊紅”
{
xe.SetAttribute("genre","update李贊紅");//則修改該屬性為“update李贊紅”
XmlNodeList nls=xe.ChildNodes;//繼續(xù)獲取xe子節(jié)點的所有子節(jié)點
foreach(XmlNode xn1 in nls)//遍歷
{
XmlElement xe2=(XmlElement)xn1;//轉(zhuǎn)換類型
if(xe2.Name=="author")//如果找到
{
xe2.InnerText="亞勝";//則修改
break;//找到退出來就可以了
}
}
break;
}
}
foreach(XmlNode xn1 in nls)//遍歷
{
XmlElement xe2=(XmlElement)xn1;//轉(zhuǎn)換類型
if(xe2.Name=="author")//如果找到
{
xe2.InnerText="亞勝";//則修改
break;//找到退出來就可以了
}
}
break;
}
}
xmlDoc.Save("bookstore.xml");//保存。
//==================================================
最后結(jié)果為:
<?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>
<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">節(jié)點的genre屬性,刪除 <book genre="update李贊紅" ISBN="2-3631-4">節(jié)點。
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();//刪除該節(jié)點的全部內(nèi)容
}
}
xmlDoc.Save("bookstore.xml");
{
XmlElement xe=(XmlElement)xn;
if(xe.GetAttribute("genre")=="fantasy")
{
xe.RemoveAttribute("genre");//刪除genre屬性
}
else if(xe.GetAttribute("genre")=="update李贊紅")
{
xe.RemoveAll();//刪除該節(jié)點的全部內(nèi)容
}
}
xmlDoc.Save("bookstore.xml");
//===========================================
最后結(jié)果為:
最后結(jié)果為:
<?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>
<bookstore>
<book ISBN="2-3631-4">
<title>Oberon's Legacy</title>
<author>Corets, Eva</author>
<price>5.95</price>
</book>
<book>
</book>
</bookstore>
4、顯示所有數(shù)據(jù)。
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"));
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);//顯示子節(jié)點點文本
}
}
foreach(XmlNode xn2 in xnf1)
{
Console.WriteLine(xn2.InnerText);//顯示子節(jié)點點文本
}
}
作者:Tyler Ning
出處:http://www.rzrgm.cn/tylerdonet/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,請微信聯(lián)系冬天里的一把火
浙公網(wǎng)安備 33010602011771號