+.net操纵xml文件类(c#)+
一直想要写一个操作XML文件的类,今天在网上找了一下,找到一个已写的差不多的类,对其进行扩展与修改,最终成了以下代码,供新手参考参考.
//
在此类中用到了XML事件.此类中对于节点的查找必需用xpath表达式,如果你对xpath表达式不了解可以查看我收藏的另外一篇文章:+XML文件操作:[学习xpath]XPath最通俗的教程+
一直想要写一个操作XML文件的类,今天在网上找了一下,找到一个已写的差不多的类,对其进行扩展与修改,最终成了以下代码,供新手参考参考.
//
在此类中用到了XML事件.此类中对于节点的查找必需用xpath表达式,如果你对xpath表达式不了解可以查看我收藏的另外一篇文章:+XML文件操作:[学习xpath]XPath最通俗的教程+


1
using System;
2
using System.Xml;
3
using System.Web;
4
namespace solucky
5

{
6
/**//// <summary>
7
/// 必需用XPATH表达式来获取相应节点
8
/// 关于xpath可以参见:
9
/// </summary>
10
public class MyXml
11
{
12
变量#region 变量
13
/**//// <summary>
14
/// xml文件所在路径类型
15
/// </summary>
16
/// <remarks>xml文件所在路径类型</remarks>
17
public enum enumXmlPathType
18
{
19
/**//// <summary>
20
/// 绝对路径
21
/// </summary>
22
AbsolutePath,
23
/**//// <summary>
24
/// 虚拟路径
25
/// </summary>
26
VirtualPath
27
}
28
29
private string xmlFilePath ;
30
private enumXmlPathType xmlFilePathType ;
31
private XmlDocument xmlDoc = new XmlDocument() ;
32
#endregion
33
34
35
属性#region 属性
36
/**//// <summary>
37
/// 文件路径
38
/// </summary>
39
/// <remarks>文件路径</remarks>
40
public string XmlFilePath
41
{
42
get
43
{
44
return this.xmlFilePath;
45
}
46
set
47
{
48
xmlFilePath = value ;
49
50
}
51
}
52
53
/**//// <summary>
54
/// 文件路径类型
55
/// </summary>
56
public enumXmlPathType XmlFilePathTyp
57
{
58
set
59
{
60
xmlFilePathType = value ;
61
}
62
}
63
#endregion
64
65
构造函数#region 构造函数
66
/**//// <summary>
67
///
68
/// </summary>
69
/// <param name="tempXmlFilePath"></param>
70
public MyXml( string tempXmlFilePath )
71
{
72
//
73
// TODO: 在此处添加构造函数逻辑
74
//
75
76
this.xmlFilePathType = enumXmlPathType.VirtualPath ;
77
this.xmlFilePath = tempXmlFilePath ;
78
GetXmlDocument() ;
79
//xmlDoc.Load( xmlFilePath ) ;
80
}
81
82
/**//// <summary>
83
/// 构造函数
84
/// </summary>
85
/// <param name="tempXmlFilePath">文件路径</param>
86
/// <param name="tempXmlFilePathType">类型</param>
87
public MyXml( string tempXmlFilePath , enumXmlPathType tempXmlFilePathType )
88
{
89
//
90
// TODO: 在此处添加构造函数逻辑
91
//
92
this.xmlFilePathType = tempXmlFilePathType ;
93
this.xmlFilePath = tempXmlFilePath ;
94
GetXmlDocument() ;
95
}
96
#endregion
97
98
99
/**////<summary>
100
///获取XmlDocument实体类
101
///</summary>
102
/// <returns>指定的XML描述文件的一个xmldocument实例</returns>
103
private XmlDocument GetXmlDocument()
104
{
105
XmlDocument doc=null;
106
107
if( this.xmlFilePathType == enumXmlPathType.AbsolutePath )
108
{
109
doc = GetXmlDocumentFromFile( xmlFilePath ) ;
110
}
111
else if( this.xmlFilePathType == enumXmlPathType.VirtualPath )
112
{
113
doc = GetXmlDocumentFromFile(HttpContext.Current.Server.MapPath(xmlFilePath)) ;
114
}
115
return doc;
116
}
117
118
private XmlDocument GetXmlDocumentFromFile(string tempXmlFilePath)
119
{
120
string xmlFileFullPath = tempXmlFilePath ;
121
xmlDoc.Load(xmlFileFullPath) ;
122
//定义事件处理
123
xmlDoc.NodeChanged += new XmlNodeChangedEventHandler(this.nodeUpdateEvent);
124
xmlDoc.NodeInserted += new XmlNodeChangedEventHandler(this.nodeInsertEvent);
125
xmlDoc.NodeRemoved += new XmlNodeChangedEventHandler(this.nodeDeleteEvent);
126
return xmlDoc ;
127
}
128
129
读取指定节点的指定属性值#region 读取指定节点的指定属性值
130
/**//// <summary>
131
/// 功能:
132
/// 读取指定节点的指定属性值
133
/// </summary>
134
/// <param name="strNode">节点名称</param>
135
/// <param name="strAttribute">此节点的属性</param>
136
/// <returns></returns>
137
public string GetXmlNodeAttributeValue(string strNode,string strAttribute)
138
{
139
string strReturn = "";
140
try
141
{
142
//根据指定路径获取节点
143
XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode) ;
144
if (!(xmlNode==null))
145
{//获取节点的属性,并循环取出需要的属性值
146
XmlAttributeCollection xmlAttr = xmlNode.Attributes ;
147
148
for(int i=0 ;i<xmlAttr.Count; i++)
149
{
150
if (xmlAttr.Item(i).Name == strAttribute)
151
{
152
strReturn = xmlAttr.Item(i).Value ;
153
break;
154
}
155
}
156
}
157
}
158
catch(XmlException xmle)
159
{
160
throw xmle ;
161
}
162
return strReturn ;
163
}
164
#endregion
165
166
167
读取指定节点的值#region 读取指定节点的值
168
/**//// <summary>
169
/// 功能:
170
/// 读取指定节点的值
171
/// </summary>
172
/// <param name="strNode">节点名称</param>
173
/// <returns></returns>
174
public string GetXmlNodeValue(string strNode)
175
{
176
string strReturn = String.Empty ;
177
178
try
179
{
180
//根据路径获取节点
181
XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode) ;
182
if (!(xmlNode==null))
183
strReturn = xmlNode.InnerText ;
184
}
185
catch(XmlException xmle)
186
{
187
throw xmle ;
188
}
189
return strReturn ;
190
}
191
#endregion
192
193
设置节点值#region 设置节点值
194
/**//// <summary>
195
/// 功能:
196
/// 设置节点值
197
/// </summary>
198
/// <param name="strNode">节点的名称</param>
199
/// <param name="newValue">节点值</param>
200
public void SetXmlNodeValue(string xmlNodePath,string xmlNodeValue)
201
{
202
try
203
{
204
//可以批量为符合条件的节点进行付值
205
XmlNodeList xmlNode=this.xmlDoc.SelectNodes(xmlNodePath);
206
if (!(xmlNode==null))
207
{
208
foreach(XmlNode xn in xmlNode)
209
{
210
xn.InnerText = xmlNodeValue ;
211
}
212
}
213
/**//*
214
* 根据指定路径获取节点
215
XmlNode xmlNode = xmlDoc.SelectSingleNode(xmlNodePath) ;
216
//设置节点值
217
if (!(xmlNode==null))
218
xmlNode.InnerText = xmlNodeValue ;*/
219
}
220
catch(XmlException xmle)
221
{
222
throw xmle ;
223
}
224
}
225
#endregion
226
227
设置节点的属性值#region 设置节点的属性值
228
/**//// <summary>
229
/// 功能:
230
/// 设置节点的属性值
231
/// </summary>
232
/// <param name="xmlNodePath">节点名称</param>
233
/// <param name="xmlNodeAttribute">属性名称</param>
234
/// <param name="xmlNodeAttributeValue">属性值</param>
235
public void SetXmlNodeAttributeValue(string xmlNodePath,string xmlNodeAttribute,string xmlNodeAttributeValue)
236
{
237
try
238
{
239
//可以批量为符合条件的节点的属性付值
240
XmlNodeList xmlNode=this.xmlDoc.SelectNodes(xmlNodePath);
241
if (!(xmlNode==null))
242
{
243
foreach(XmlNode xn in xmlNode)
244
{
245
XmlAttributeCollection xmlAttr = xn.Attributes ;
246
for(int i=0 ; i<xmlAttr.Count ; i++)
247
{
248
if ( xmlAttr.Item(i).Name == xmlNodeAttribute )
249
{
250
xmlAttr.Item(i).Value = xmlNodeAttributeValue;
251
break ;
252
}
253
}
254
}
255
}
256
/**//*单个节点
257
//根据指定路径获取节点
258
XmlNode xmlNode = xmlDoc.SelectSingleNode(xmlNodePath) ;
259
if (!(xmlNode==null))
260
{//获取节点的属性,并循环取出需要的属性值
261
XmlAttributeCollection xmlAttr = xmlNode.Attributes ;
262
for(int i=0 ; i<xmlAttr.Count ; i++)
263
{
264
if ( xmlAttr.Item(i).Name == xmlNodeAttribute )
265
{
266
xmlAttr.Item(i).Value = xmlNodeAttributeValue;
267
break ;
268
}
269
}
270
}
271
*/
272
}
273
catch(XmlException xmle)
274
{
275
throw xmle ;
276
}
277
}
278
#endregion
279
280
添加#region 添加
281
/**//// <summary>
282
/// 获取XML文件的根元素
283
/// </summary>
284
public XmlNode GetXmlRoot()
285
{
286
return xmlDoc.DocumentElement ;
287
}
288
289
/**//// <summary>
290
/// 在根节点下添加父节点
291
/// </summary>
292
public void AddParentNode(string parentNode)
293
{
294
try
295
{
296
XmlNode root = GetXmlRoot() ;
297
XmlNode parentXmlNode = xmlDoc.CreateElement(parentNode) ;
298
root.AppendChild(parentXmlNode) ;
299
}
300
catch(XmlException xmle)
301
{
302
throw xmle ;
303
}
304
}
305
306
/**//// <summary>
307
/// 向一个已经存在的父节点中插入一个子节点
308
/// </summary>
309
/// <param name="parentNodePath">父节点</param>
310
/// <param name="childNodePath">字节点名称</param>
311
public void AddChildNode( string parentNodePath,string childnodename )
312
{
313
try
314
{
315
XmlNode parentXmlNode = xmlDoc.SelectSingleNode(parentNodePath) ;
316
if(!((parentXmlNode)==null))//如果此节点存在
317
{
318
XmlNode childXmlNode = xmlDoc.CreateElement(childnodename) ;
319
parentXmlNode.AppendChild( childXmlNode ) ;
320
}
321
else
{//如果不存在就放父节点添加
322
//this.GetXmlRoot().AppendChild(childXmlNode);
323
}
324
325
}
326
catch(XmlException xmle)
327
{
328
throw xmle;
329
}
330
}
331
332
/**//// <summary>
333
/// 向一个节点添加属性
334
/// </summary>
335
/// <param name="NodePath">节点路径</param>
336
/// <param name="NodeAttribute">属性名</param>
337
public void AddAttribute( string NodePath , string NodeAttribute)
338
{
339
privateAddAttribute(NodePath,NodeAttribute,"");
340
}
341
/**//// <summary>
342
///
343
/// </summary>
344
/// <param name="NodePath"></param>
345
/// <param name="NodeAttribute"></param>
346
/// <param name="NodeAttributeValue"></param>
347
private void privateAddAttribute( string NodePath , string NodeAttribute,string NodeAttributeValue)
348
{
349
try
350
{
351
XmlNode nodePath = xmlDoc.SelectSingleNode( NodePath ) ;
352
if (!(nodePath==null))
353
{
354
XmlAttribute nodeAttribute = this.xmlDoc.CreateAttribute(NodeAttribute);
355
nodeAttribute.Value=NodeAttributeValue;
356
nodePath.Attributes.Append(nodeAttribute) ;
357
}
358
}
359
catch(XmlException xmle)
360
{
361
throw xmle;
362
}
363
}
364
/**//// <summary>
365
/// 向一个节点添加属性,并付值
366
/// </summary>
367
/// <param name="NodePath">节点</param>
368
/// <param name="NodeAttribute">属性名</param>
369
/// <param name="NodeAttributeValue">属性值</param>
370
public void AddAttribute( string NodePath , string NodeAttribute,string NodeAttributeValue)
371
{
372
privateAddAttribute(NodePath,NodeAttribute,NodeAttributeValue);
373
}
374
#endregion
375
376
删除#region 删除
377
/**//// <summary>
378
/// 删除节点的一个属性
379
/// </summary>
380
/// <param name="NodePath">节点所在的xpath表达式</param>
381
/// <param name="NodeAttribute">属性名</param>
382
public void DeleteAttribute( string NodePath , string NodeAttribute)
383
{
384
XmlNodeList nodePath =this.xmlDoc.SelectNodes(NodePath);
385
if (!(nodePath==null))
386
{
387
foreach (XmlNode tempxn in nodePath)
388
{
389
XmlAttributeCollection xmlAttr = tempxn.Attributes ;
390
for(int i=0 ; i<xmlAttr.Count ; i++)
391
{
392
if ( xmlAttr.Item(i).Name == NodeAttribute)
393
{
394
tempxn.Attributes.RemoveAt(i);
395
break ;
396
}
397
}
398
}
399
}
400
}
401
402
/**//// <summary>
403
/// 删除节点,当其属性值等于给定的值时
404
/// </summary>
405
/// <param name="NodePath">节点所在的xpath表达式</param>
406
/// <param name="NodeAttribute">属性</param>
407
/// <param name="NodeAttributeValue">值</param>
408
public void DeleteAttribute( string NodePath , string NodeAttribute , string NodeAttributeValue)
409
{
410
XmlNodeList nodePath =this.xmlDoc.SelectNodes(NodePath);
411
if (!(nodePath==null))
412
{
413
foreach (XmlNode tempxn in nodePath)
414
{
415
XmlAttributeCollection xmlAttr = tempxn.Attributes ;
416
for(int i=0 ; i<xmlAttr.Count ; i++)
417
{
418
if ( xmlAttr.Item(i).Name == NodeAttribute && xmlAttr.Item(i).Value==NodeAttributeValue)
419
{
420
tempxn.Attributes.RemoveAt(i);
421
break ;
422
}
423
}
424
}
425
}
426
}
427
/**//// <summary>
428
/// 删除节点
429
/// </summary>
430
/// <param name="tempXmlNode"></param>
431
/// <remarks></remarks>
432
public void DeleteXmlNode(string tempXmlNode)
{
433
XmlNodeList nodePath =this.xmlDoc.SelectNodes(tempXmlNode);
434
if (!(nodePath==null))
435
{
436
foreach(XmlNode xn in nodePath)
437
{
438
xn.ParentNode.RemoveChild(xn);
439
}
440
}
441
}
442
443
#endregion
444
445
XML文档事件#region XML文档事件
446
/**//// <summary>
447
///
448
/// </summary>
449
/// <param name="src"></param>
450
/// <param name="args"></param>
451
private void nodeInsertEvent(Object src, XmlNodeChangedEventArgs args)
452
{
453
//保存设置
454
SaveXmlDocument();
455
}
456
/**//// <summary>
457
///
458
/// </summary>
459
/// <param name="src"></param>
460
/// <param name="args"></param>
461
private void nodeDeleteEvent(Object src, XmlNodeChangedEventArgs args)
462
{
463
//保存设置
464
SaveXmlDocument();
465
}
466
/**//// <summary>
467
///
468
/// </summary>
469
/// <param name="src"></param>
470
/// <param name="args"></param>
471
private void nodeUpdateEvent(Object src, XmlNodeChangedEventArgs args)
472
{
473
//保存设置
474
SaveXmlDocument();
475
}
476
#endregion
477
478
保存XML文件#region 保存XML文件
479
/**//// <summary>
480
/// 功能:
481
/// 保存XML文件
482
///
483
/// </summary>
484
public void SaveXmlDocument()
485
{
486
try
487
{
488
//保存设置的结果
489
if( this.xmlFilePathType == enumXmlPathType.AbsolutePath )
490
{
491
Savexml( xmlFilePath ) ;
492
}
493
else if( this.xmlFilePathType == enumXmlPathType.VirtualPath )
494
{
495
Savexml(HttpContext.Current.Server.MapPath(xmlFilePath)) ;
496
}
497
}
498
catch(XmlException xmle)
499
{
500
throw xmle;
501
}
502
}
503
504
/**//// <summary>
505
/// 功能:
506
/// 保存XML文件
507
/// </summary>
508
public void SaveXmlDocument(string tempXMLFilePath)
509
{
510
try
511
{
512
//保存设置的结果
513
Savexml(tempXMLFilePath);
514
}
515
catch(XmlException xmle)
516
{
517
throw xmle;
518
}
519
}
520
/**//// <summary>
521
///
522
/// </summary>
523
/// <param name="filepath"></param>
524
private void Savexml(string filepath)
525
{
526
xmlDoc.Save(filepath);
527
}
528
529
#endregion
530
531
}
532
533
}
534
535
//
在此类中用到了XML事件.此类中对于节点的查找必需用xpath表达式,如果你对xpath表达式不了解可以查看我收藏的另外一篇文章:+XML文件操作:[学习xpath]XPath最通俗的教程+


1

2

3

4

5



6


7

8

9

10

11



12


13


14

15

16

17

18



19


20

21

22

23


24

25

26

27

28

29

30

31

32

33

34

35


36


37

38

39

40

41



42

43



44

45

46

47



48

49

50

51

52

53


54

55

56

57



58

59



60

61

62

63

64

65


66


67

68

69

70

71



72

73

74

75

76

77

78

79

80

81

82


83

84

85

86

87

88



89

90

91

92

93

94

95

96

97

98

99


100

101

102

103

104



105

106

107

108



109

110

111

112



113

114

115

116

117

118

119



120

121

122

123

124

125

126

127

128

129


130


131

132

133

134

135

136

137

138



139

140

141



142

143

144

145



146

147

148

149



150

151



152

153

154

155

156

157

158

159



160

161

162

163

164

165

166

167


168


169

170

171

172

173

174

175



176

177

178

179



180

181

182

183

184

185

186



187

188

189

190

191

192

193


194


195

196

197

198

199

200

201



202

203



204

205

206

207



208

209



210

211

212

213


214

215

216

217

218

219

220

221



222

223

224

225

226

227


228


229

230

231

232

233

234

235

236



237

238



239

240

241

242



243

244



245

246

247



248

249



250

251

252

253

254

255

256


257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274



275

276

277

278

279

280


281


282

283

284

285



286

287

288

289


290

291

292

293



294

295



296

297

298

299

300

301



302

303

304

305

306


307

308

309

310

311

312



313

314



315

316

317



318

319

320

321



322

323

324

325

326

327



328

329

330

331

332


333

334

335

336

337

338



339

340

341


342

343

344

345

346

347

348



349

350



351

352

353



354

355

356

357

358

359

360



361

362

363

364


365

366

367

368

369

370

371



372

373

374

375

376


377


378

379

380

381

382

383



384

385

386



387

388



389

390

391



392

393



394

395

396

397

398

399

400

401

402


403

404

405

406

407

408

409



410

411

412



413

414



415

416

417



418

419



420

421

422

423

424

425

426

427


428

429

430

431

432



433

434

435



436

437



438

439

440

441

442

443

444

445


446


447

448

449

450

451

452



453

454

455

456


457

458

459

460

461

462



463

464

465

466


467

468

469

470

471

472



473

474

475

476

477

478


479


480

481

482

483

484

485



486

487



488

489

490



491

492

493

494



495

496

497

498

499



500

501

502

503

504


505

506

507

508

509



510

511



512

513

514

515

516



517

518

519

520


521

522

523

524

525



526

527

528

529

530

531

532

533

534

535
