XMLHelper类
经过这些日子以来,我根据上篇随笔中读写程序配置文件节点的方法来扩展了其功能,并写了这个XML文档的操作管理帮助类XMLHelper出来,这个XMLHelper类中包括了XML文档的创建,文档节点和属性的读取,添加,修改,删除的方法功能的实现,有兴趣的朋友,可以进来看看,所有代码都在WebForm和WinForm中调试通过.
XML文档

1
//======================================================================
2
//
3
// Copyright(C) 2009-2010 连林SoftWare工作室
4
// All Rights Reserved
5
//
6
// FileName: XMLHelper
7
// Description: XML文档帮助类,静态方法,实现对
8
// XML文档的创建,及节点和属性的增、删、改、查
9
//
10
// Author: Wang Lian Lin(王连林)
11
// CLR版本: 2.0.50727.42
12
// MachineName: WLL
13
// 注册组织名: WLL
14
// Created By Wang Lian Lin(王连林) at 2009-3-22 16:50:44
15
// Email: LianLin.Wang@163.com
16
// http://chnboy.cnblogs.com
17
//
18
//======================================================================
19
using System;
20
using System.Xml;
21
22
/// <summary>
23
/// XMLHelper XML文档操作管理器
24
/// </summary>
25
public class XMLHelper
26
{
27
public XMLHelper()
28
{
29
//
30
// TODO: 在此处添加构造函数逻辑
31
//
32
}
33
34
35
XML文档节点查询和读取
112
113
#region XML文档创建和节点或属性的添加、修改
114
/// <summary>
115
/// 创建一个XML文档
116
/// </summary>
117
/// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>
118
/// <param name="rootNodeName">XML文档根节点名称(须指定一个根节点名称)</param>
119
/// <param name="version">XML文档版本号(必须为:"1.0")</param>
120
/// <param name="encoding">XML文档编码方式</param>
121
/// <param name="standalone">该值必须是"yes"或"no",如果为null,Save方法不在XML声明上写出独立属性</param>
122
/// <returns>成功返回true,失败返回false</returns>
123
public static bool CreateXmlDocument(string xmlFileName, string rootNodeName, string version, string encoding, string standalone)
124
{
125
bool isSuccess = false;
126
try
127
{
128
XmlDocument xmlDoc = new XmlDocument();
129
XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration(version, encoding, standalone);
130
XmlNode root = xmlDoc.CreateElement(rootNodeName);
131
xmlDoc.AppendChild(xmlDeclaration);
132
xmlDoc.AppendChild(root);
133
xmlDoc.Save(xmlFileName);
134
isSuccess = true;
135
}
136
catch (Exception ex)
137
{
138
throw ex; //这里可以定义你自己的异常处理
139
}
140
return isSuccess;
141
}
142
143
/// <summary>
144
/// 依据匹配XPath表达式的第一个节点来创建它的子节点(如果此节点已存在则追加一个新的同名节点
145
/// </summary>
146
/// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>
147
/// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param>
148
/// <param name="xmlNodeName">要匹配xmlNodeName的节点名称</param>
149
/// <param name="innerText">节点文本值</param>
150
/// <param name="xmlAttributeName">要匹配xmlAttributeName的属性名称</param>
151
/// <param name="value">属性值</param>
152
/// <returns>成功返回true,失败返回false</returns>
153
public static bool CreateXmlNodeByXPath(string xmlFileName, string xpath, string xmlNodeName, string innerText, string xmlAttributeName, string value)
154
{
155
bool isSuccess = false;
156
XmlDocument xmlDoc = new XmlDocument();
157
try
158
{
159
xmlDoc.Load(xmlFileName); //加载XML文档
160
XmlNode xmlNode = xmlDoc.SelectSingleNode(xpath);
161
if (xmlNode != null)
162
{
163
//存不存在此节点都创建
164
XmlElement subElement = xmlDoc.CreateElement(xmlNodeName);
165
subElement.InnerXml = innerText;
166
167
//如果属性和值参数都不为空则在此新节点上新增属性
168
if (!string.IsNullOrEmpty(xmlAttributeName) && !string.IsNullOrEmpty(value))
169
{
170
XmlAttribute xmlAttribute = xmlDoc.CreateAttribute(xmlAttributeName);
171
xmlAttribute.Value = value;
172
subElement.Attributes.Append(xmlAttribute);
173
}
174
175
xmlNode.AppendChild(subElement);
176
}
177
xmlDoc.Save(xmlFileName); //保存到XML文档
178
isSuccess = true;
179
}
180
catch (Exception ex)
181
{
182
throw ex; //这里可以定义你自己的异常处理
183
}
184
return isSuccess;
185
}
186
187
/// <summary>
188
/// 依据匹配XPath表达式的第一个节点来创建或更新它的子节点(如果节点存在则更新,不存在则创建)
189
/// </summary>
190
/// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>
191
/// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param>
192
/// <param name="xmlNodeName">要匹配xmlNodeName的节点名称</param>
193
/// <param name="innerText">节点文本值</param>
194
/// <returns>成功返回true,失败返回false</returns>
195
public static bool CreateOrUpdateXmlNodeByXPath(string xmlFileName, string xpath, string xmlNodeName, string innerText)
196
{
197
bool isSuccess = false;
198
bool isExistsNode = false;//标识节点是否存在
199
XmlDocument xmlDoc = new XmlDocument();
200
try
201
{
202
xmlDoc.Load(xmlFileName); //加载XML文档
203
XmlNode xmlNode = xmlDoc.SelectSingleNode(xpath);
204
if (xmlNode != null)
205
{
206
//遍历xpath节点下的所有子节点
207
foreach (XmlNode node in xmlNode.ChildNodes)
208
{
209
if (node.Name.ToLower() == xmlNodeName.ToLower())
210
{
211
//存在此节点则更新
212
node.InnerXml = innerText;
213
isExistsNode = true;
214
break;
215
}
216
}
217
if (!isExistsNode)
218
{
219
//不存在此节点则创建
220
XmlElement subElement = xmlDoc.CreateElement(xmlNodeName);
221
subElement.InnerXml = innerText;
222
xmlNode.AppendChild(subElement);
223
}
224
}
225
xmlDoc.Save(xmlFileName); //保存到XML文档
226
isSuccess = true;
227
}
228
catch (Exception ex)
229
{
230
throw ex; //这里可以定义你自己的异常处理
231
}
232
return isSuccess;
233
}
234
235
/// <summary>
236
/// 依据匹配XPath表达式的第一个节点来创建或更新它的属性(如果属性存在则更新,不存在则创建)
237
/// </summary>
238
/// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>
239
/// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param>
240
/// <param name="xmlAttributeName">要匹配xmlAttributeName的属性名称</param>
241
/// <param name="value">属性值</param>
242
/// <returns>成功返回true,失败返回false</returns>
243
public static bool CreateOrUpdateXmlAttributeByXPath(string xmlFileName, string xpath, string xmlAttributeName, string value)
244
{
245
bool isSuccess = false;
246
bool isExistsAttribute = false;//标识属性是否存在
247
XmlDocument xmlDoc = new XmlDocument();
248
try
249
{
250
xmlDoc.Load(xmlFileName); //加载XML文档
251
XmlNode xmlNode = xmlDoc.SelectSingleNode(xpath);
252
if (xmlNode != null)
253
{
254
//遍历xpath节点中的所有属性
255
foreach (XmlAttribute attribute in xmlNode.Attributes)
256
{
257
if (attribute.Name.ToLower() == xmlAttributeName.ToLower())
258
{
259
//节点中存在此属性则更新
260
attribute.Value = value;
261
isExistsAttribute = true;
262
break;
263
}
264
}
265
if (!isExistsAttribute)
266
{
267
//节点中不存在此属性则创建
268
XmlAttribute xmlAttribute = xmlDoc.CreateAttribute(xmlAttributeName);
269
xmlAttribute.Value = value;
270
xmlNode.Attributes.Append(xmlAttribute);
271
}
272
}
273
xmlDoc.Save(xmlFileName); //保存到XML文档
274
isSuccess = true;
275
}
276
catch (Exception ex)
277
{
278
throw ex; //这里可以定义你自己的异常处理
279
}
280
return isSuccess;
281
}
282
#endregion
283
284
XML文档节点或属性的删除
389
390
}
391
参考我的上篇随笔:关于C#和ASP.NET中对App.config和Web.config文件里的[appSettings]和[connectionStrings]节点进行新增、修改、删除和读取相关的操作
这是下面要操作的XML文档:
以下是XMLHelper文档操作帮助类代码:
1
//======================================================================2
//3
// Copyright(C) 2009-2010 连林SoftWare工作室 4
// All Rights Reserved5
//6
// FileName: XMLHelper 7
// Description: XML文档帮助类,静态方法,实现对8
// XML文档的创建,及节点和属性的增、删、改、查9
//10
// Author: Wang Lian Lin(王连林)11
// CLR版本: 2.0.50727.4212
// MachineName: WLL13
// 注册组织名: WLL14
// Created By Wang Lian Lin(王连林) at 2009-3-22 16:50:44 15
// Email: LianLin.Wang@163.com16
// http://chnboy.cnblogs.com17
//18
//======================================================================19
using System;20
using System.Xml;21

22
/// <summary>23
/// XMLHelper XML文档操作管理器24
/// </summary>25
public class XMLHelper26
{27
public XMLHelper()28
{29
//30
// TODO: 在此处添加构造函数逻辑31
//32
}33

34

35
XML文档节点查询和读取112

113
#region XML文档创建和节点或属性的添加、修改114
/// <summary>115
/// 创建一个XML文档116
/// </summary>117
/// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>118
/// <param name="rootNodeName">XML文档根节点名称(须指定一个根节点名称)</param>119
/// <param name="version">XML文档版本号(必须为:"1.0")</param>120
/// <param name="encoding">XML文档编码方式</param>121
/// <param name="standalone">该值必须是"yes"或"no",如果为null,Save方法不在XML声明上写出独立属性</param>122
/// <returns>成功返回true,失败返回false</returns>123
public static bool CreateXmlDocument(string xmlFileName, string rootNodeName, string version, string encoding, string standalone)124
{125
bool isSuccess = false;126
try127
{128
XmlDocument xmlDoc = new XmlDocument();129
XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration(version, encoding, standalone);130
XmlNode root = xmlDoc.CreateElement(rootNodeName);131
xmlDoc.AppendChild(xmlDeclaration);132
xmlDoc.AppendChild(root);133
xmlDoc.Save(xmlFileName);134
isSuccess = true;135
}136
catch (Exception ex)137
{138
throw ex; //这里可以定义你自己的异常处理139
}140
return isSuccess;141
}142

143
/// <summary>144
/// 依据匹配XPath表达式的第一个节点来创建它的子节点(如果此节点已存在则追加一个新的同名节点145
/// </summary>146
/// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>147
/// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param>148
/// <param name="xmlNodeName">要匹配xmlNodeName的节点名称</param>149
/// <param name="innerText">节点文本值</param>150
/// <param name="xmlAttributeName">要匹配xmlAttributeName的属性名称</param>151
/// <param name="value">属性值</param>152
/// <returns>成功返回true,失败返回false</returns>153
public static bool CreateXmlNodeByXPath(string xmlFileName, string xpath, string xmlNodeName, string innerText, string xmlAttributeName, string value)154
{155
bool isSuccess = false;156
XmlDocument xmlDoc = new XmlDocument();157
try158
{159
xmlDoc.Load(xmlFileName); //加载XML文档160
XmlNode xmlNode = xmlDoc.SelectSingleNode(xpath);161
if (xmlNode != null)162
{163
//存不存在此节点都创建164
XmlElement subElement = xmlDoc.CreateElement(xmlNodeName);165
subElement.InnerXml = innerText;166

167
//如果属性和值参数都不为空则在此新节点上新增属性168
if (!string.IsNullOrEmpty(xmlAttributeName) && !string.IsNullOrEmpty(value))169
{170
XmlAttribute xmlAttribute = xmlDoc.CreateAttribute(xmlAttributeName);171
xmlAttribute.Value = value;172
subElement.Attributes.Append(xmlAttribute);173
}174

175
xmlNode.AppendChild(subElement);176
}177
xmlDoc.Save(xmlFileName); //保存到XML文档178
isSuccess = true;179
}180
catch (Exception ex)181
{182
throw ex; //这里可以定义你自己的异常处理183
}184
return isSuccess;185
}186

187
/// <summary>188
/// 依据匹配XPath表达式的第一个节点来创建或更新它的子节点(如果节点存在则更新,不存在则创建)189
/// </summary>190
/// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>191
/// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param>192
/// <param name="xmlNodeName">要匹配xmlNodeName的节点名称</param>193
/// <param name="innerText">节点文本值</param>194
/// <returns>成功返回true,失败返回false</returns>195
public static bool CreateOrUpdateXmlNodeByXPath(string xmlFileName, string xpath, string xmlNodeName, string innerText)196
{197
bool isSuccess = false;198
bool isExistsNode = false;//标识节点是否存在199
XmlDocument xmlDoc = new XmlDocument();200
try201
{202
xmlDoc.Load(xmlFileName); //加载XML文档203
XmlNode xmlNode = xmlDoc.SelectSingleNode(xpath);204
if (xmlNode != null)205
{206
//遍历xpath节点下的所有子节点207
foreach (XmlNode node in xmlNode.ChildNodes)208
{209
if (node.Name.ToLower() == xmlNodeName.ToLower())210
{211
//存在此节点则更新212
node.InnerXml = innerText;213
isExistsNode = true;214
break;215
}216
}217
if (!isExistsNode)218
{219
//不存在此节点则创建220
XmlElement subElement = xmlDoc.CreateElement(xmlNodeName);221
subElement.InnerXml = innerText;222
xmlNode.AppendChild(subElement);223
}224
}225
xmlDoc.Save(xmlFileName); //保存到XML文档226
isSuccess = true;227
}228
catch (Exception ex)229
{230
throw ex; //这里可以定义你自己的异常处理231
}232
return isSuccess;233
}234

235
/// <summary>236
/// 依据匹配XPath表达式的第一个节点来创建或更新它的属性(如果属性存在则更新,不存在则创建)237
/// </summary>238
/// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>239
/// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param>240
/// <param name="xmlAttributeName">要匹配xmlAttributeName的属性名称</param>241
/// <param name="value">属性值</param>242
/// <returns>成功返回true,失败返回false</returns>243
public static bool CreateOrUpdateXmlAttributeByXPath(string xmlFileName, string xpath, string xmlAttributeName, string value)244
{245
bool isSuccess = false;246
bool isExistsAttribute = false;//标识属性是否存在247
XmlDocument xmlDoc = new XmlDocument();248
try249
{250
xmlDoc.Load(xmlFileName); //加载XML文档251
XmlNode xmlNode = xmlDoc.SelectSingleNode(xpath);252
if (xmlNode != null)253
{254
//遍历xpath节点中的所有属性255
foreach (XmlAttribute attribute in xmlNode.Attributes)256
{257
if (attribute.Name.ToLower() == xmlAttributeName.ToLower())258
{259
//节点中存在此属性则更新260
attribute.Value = value;261
isExistsAttribute = true;262
break;263
}264
}265
if (!isExistsAttribute)266
{267
//节点中不存在此属性则创建268
XmlAttribute xmlAttribute = xmlDoc.CreateAttribute(xmlAttributeName);269
xmlAttribute.Value = value;270
xmlNode.Attributes.Append(xmlAttribute);271
}272
}273
xmlDoc.Save(xmlFileName); //保存到XML文档274
isSuccess = true;275
}276
catch (Exception ex)277
{278
throw ex; //这里可以定义你自己的异常处理279
}280
return isSuccess;281
}282
#endregion283

284
XML文档节点或属性的删除389

390
}391

1.创建XML文档:
//这是XML文档根节点名
string rootNodeName = "books";
//这是XML文档物理文件名(包含物理路径)
string xmlFileName = Application.StartupPath + @"\book.xml";
XMLHelper.CreateXmlDocument(xmlFileName, rootNodeName, "1.0", "utf-8", null);
MessageBox.Show("XML文档创建成功:" + xmlFileName);
string rootNodeName = "books";
//这是XML文档物理文件名(包含物理路径)
string xmlFileName = Application.StartupPath + @"\book.xml";
XMLHelper.CreateXmlDocument(xmlFileName, rootNodeName, "1.0", "utf-8", null);
MessageBox.Show("XML文档创建成功:" + xmlFileName);
2.向XML文档中添加一个新节点:
string xmlFileName = Application.StartupPath + @"\book.xml";
string xpath = "/books"; //这是新节点的父节点路径
string nodename = "book"; //这是新节点名称,在父节点下新增
string nodetext = "这是新节点中的文本值";
bool isSuccess = XMLHelper.CreateOrUpdateXmlNodeByXPath(xmlFileName, xpath, nodename, nodetext);
MessageBox.Show("XML节点添加或更新成功:" + isSuccess.ToString());
string xpath = "/books"; //这是新节点的父节点路径
string nodename = "book"; //这是新节点名称,在父节点下新增
string nodetext = "这是新节点中的文本值";
bool isSuccess = XMLHelper.CreateOrUpdateXmlNodeByXPath(xmlFileName, xpath, nodename, nodetext);
MessageBox.Show("XML节点添加或更新成功:" + isSuccess.ToString());
3.向XML文档中的子节点中新增或修改(如果存在则修改)一个子节点,比如name,author,date节点等:
string xmlFileName = Application.StartupPath + @"\book.xml";
string xpath = "/books/book"; //这是新子节点的父节点路径
string nodename = "name"; //这是新子节点名称,在父节点下新增
string nodetext = "我的世界我的梦";
bool isSuccess = XMLHelper.CreateOrUpdateXmlNodeByXPath(xmlFileName, xpath, nodename, nodetext);
MessageBox.Show("XML节点添加或更新成功:" + isSuccess.ToString());
string xpath = "/books/book"; //这是新子节点的父节点路径
string nodename = "name"; //这是新子节点名称,在父节点下新增
string nodetext = "我的世界我的梦";
bool isSuccess = XMLHelper.CreateOrUpdateXmlNodeByXPath(xmlFileName, xpath, nodename, nodetext);
MessageBox.Show("XML节点添加或更新成功:" + isSuccess.ToString());
4. 向XML文档中的子节点中新增或修改(如果存在则修改)一个子节点属性,比如id,ISDN属性等:
string xmlFileName = Application.StartupPath + @"\book.xml";
string xpath = "/books/book"; //要新增属性的节点
string attributeName = "id"; //新属性名称,ISDN号也是这么新增的
string attributeValue = "1"; //新属性值
bool isSuccess = XMLHelper.CreateOrUpdateXmlAttributeByXPath(xmlFileName, xpath, attributeName, attributeValue);
MessageBox.Show("XML属性添加或更新成功:" + isSuccess.ToString());
string xpath = "/books/book"; //要新增属性的节点
string attributeName = "id"; //新属性名称,ISDN号也是这么新增的
string attributeValue = "1"; //新属性值
bool isSuccess = XMLHelper.CreateOrUpdateXmlAttributeByXPath(xmlFileName, xpath, attributeName, attributeValue);
MessageBox.Show("XML属性添加或更新成功:" + isSuccess.ToString());
5. 删除XML文档中的子节点:
string xmlFileName = Application.StartupPath + @"\book.xml";
string xpath = "/books/book[@id='1']"; //要删除的id为1的book子节点
bool isSuccess = XMLHelper.DeleteXmlNodeByXPath(xmlFileName, xpath);
MessageBox.Show("XML节点删除成功:" + isSuccess.ToString());
string xpath = "/books/book[@id='1']"; //要删除的id为1的book子节点
bool isSuccess = XMLHelper.DeleteXmlNodeByXPath(xmlFileName, xpath);
MessageBox.Show("XML节点删除成功:" + isSuccess.ToString());
6. 删除XML文档中子节点的属性:
string xmlFileName = Application.StartupPath + @"\book.xml";
//删除id为2的book子节点中的ISDN属性
string xpath = "/books/book[@id='2']";
string attributeName = "ISDN";
bool isSuccess = XMLHelper.DeleteXmlAttributeByXPath(xmlFileName, xpath,attributeName);
MessageBox.Show("XML属性删除成功:" + isSuccess.ToString());
//删除id为2的book子节点中的ISDN属性
string xpath = "/books/book[@id='2']";
string attributeName = "ISDN";
bool isSuccess = XMLHelper.DeleteXmlAttributeByXPath(xmlFileName, xpath,attributeName);
MessageBox.Show("XML属性删除成功:" + isSuccess.ToString());
7.读取XML文档中的所有子节点:
string xmlFileName = Application.StartupPath + @"\book.xml";
//要读的id为1的book子节点
string xpath = "/books/book[@id='1']";
XmlNodeList nodeList = XMLHelper.GetXmlNodeListByXpath(xmlFileName, xpath);
string strAllNode = "";
//遍历节点中所有的子节点
foreach (XmlNode node in nodeList)
{
strAllNode += "\n name:" + node.Name + " InnerText:" + node.InnerText;
}
MessageBox.Show("XML节点中所有子节点有:" + strAllNode);
//要读的id为1的book子节点
string xpath = "/books/book[@id='1']";
XmlNodeList nodeList = XMLHelper.GetXmlNodeListByXpath(xmlFileName, xpath);
string strAllNode = "";
//遍历节点中所有的子节点
foreach (XmlNode node in nodeList)
{
strAllNode += "\n name:" + node.Name + " InnerText:" + node.InnerText;
}
MessageBox.Show("XML节点中所有子节点有:" + strAllNode);
8.其它的方法我就不一一的例举了,各位自己动手去尝试便知,关键的地方就是那个xpath的参数设置了,
这个是XML文档中xpath语法,大家去网上一查便明白,好了,我要休息去,明白偶还有很多的工作做...


浙公网安备 33010602011771号