以前から XML ファイルを操作するためのクラスを書きたいと思っていたので、今日ネットで検索したところ、既に作成した同様のクラスを見つけて拡張、修正した結果、初心者向けに以下のコードになりました。
//
このクラスでは XML イベントが使用されます。このクラスのノードの検索では xpath 式を使用する必要があります。xpath 式を理解していない場合は、私のコレクションの別の記事「+XML ファイル操作: [Xpath の学習]XPath」を参照してください。最も人気のあるチュートリアル +
1 システムを使用;
2System.Xml を使用します。
3System.Web を使用します。
4名前空間ソルラッキー
5{
6 /**//// <概要>
7 /// 対応するノードを取得するには XPATH 式を使用する必要があります
8 /// xpath については、以下を参照してください。
9 /// </まとめ>
10 パブリッククラス MyXml
11 {
12 変数#region 変数
13 /**//// <概要>
14 ///xml ファイルが配置されているパスのタイプ
15 /// </まとめ>
16 /// <remarks>xml ファイルが配置されているパスの種類</remarks>
17 パブリック列挙型 enumXmlPathType
18 {
19 /**//// <概要>
20 /// 絶対パス
21 /// </まとめ>
22絶対パス、
23 /**//// <概要>
24 /// 仮想パス
25 /// </まとめ>
26仮想パス
27}
28
29 プライベート文字列 xmlFilePath;
30 プライベート enumXmlPathType xmlFilePathType;
31 private XmlDocument xmlDoc = new XmlDocument();
32 #エンドリージョン
33
34
35 プロパティ#地域プロパティ
36 /**//// <概要>
37 /// ファイルパス
38 /// </要約>
39 /// <remarks>ファイルパス</remarks>
40 パブリック文字列XmlFilePath
41 {
42 ゲット
43 {
44 this.xmlFilePath を返します。
45 }
46セット
47 {
48 xmlFilePath = 値;
49
50 }
51 }
52
53 /**//// <概要>
54 /// ファイルパスの種類
55 /// </まとめ>
56 パブリック enumXmlPathType XmlFilePathTyp
57 {
58セット
59 {
60 xmlFilePathType = 値;
61 }
62 }
63 #エンドリージョン
64
65 コンストラクター #region コンストラクター
66 /**//// <概要>
67 ///
68 /// </まとめ>
69 /// <param name="tempXmlFilePath"></param>
70 パブリック MyXml(string tempXmlFilePath)
71 {
72 //
73 // TODO: ここにコンストラクター ロジックを追加します
74 //
75
76 this.xmlFilePathType = enumXmlPathType.VirtualPath;
77 この.xmlファイルパス = tempXmlファイルパス;
78 GetXmlDocument();
79 //xmlDoc.Load(xmlFilePath);
80}
81
82 /**//// <概要>
83 /// コンストラクター
84 /// </まとめ>
85 /// <param name="tempXmlFilePath">ファイルパス</param>
86 /// <param name="tempXmlFilePathType">タイプ</param>
87 パブリック MyXml( string tempXmlFilePath , enumXmlPathType tempXmlFilePathType )
88 {
89 //
90 // TODO: ここにコンストラクター ロジックを追加します
91 //
92 this.xmlFilePathType = tempXmlFilePathType;
93 この.xmlファイルパス = tempXmlファイルパス;
94 GetXmlDocument();
95 }
96 #エンドリージョン
97
98
99 /**////<概要>
100 ///XmlDocumentエンティティクラスを取得する
101 ///</まとめ>
102 /// <returns>指定された XML 記述ファイルの xmldocument インスタンス</returns>
103 プライベート XmlDocument GetXmlDocument()
104 {
105 XmlDocument doc=null;
106
107 if( this.xmlFilePathType == enumXmlPathType.AbsolutePath )
108 {
109 ドキュメント = GetXmlDocumentFromFile( xmlFilePath );
110 }
111 else if( this.xmlFilePathType == enumXmlPathType.VirtualPath )
112 {
113 doc = GetXmlDocumentFromFile(HttpContext.Current.Server.MapPath(xmlFilePath));
114 }
115 ドキュメントを返します。
116 }
117
118 プライベート XmlDocument GetXmlDocumentFromFile(string tempXmlFilePath)
119 {
120 文字列 xmlFileFullPath = tempXmlFilePath;
121 xmlDoc.Load(xmlFileFullPath);
122 //イベント処理を定義する
123 xmlDoc.NodeChanged += 新しい XmlNodeChangedEventHandler(this.nodeUpdateEvent);
124 xmlDoc.NodeInserted += 新しい XmlNodeChangedEventHandler(this.nodeInsertEvent);
125 xmlDoc.NodeRemoved += 新しい XmlNodeChangedEventHandler(this.nodeDeleteEvent);
126 xmlDocを返します。
127 }
128
129 指定ノードの指定属性値を読み取る #region 指定ノードの指定属性値を読み取る
130 /**//// <概要>
131 /// 機能:
132 /// 指定されたノードの指定された属性値を読み取ります
133 /// </概要>
134 /// <param name="strNode">ノード名</param>
135 /// <param name="strAttribute">このノードの属性</param>
136 /// <リターン></リターン>
137 パブリック文字列 GetXmlNodeAttributeValue(string strNode,string strAttribute)
138 {
139 文字列strReturn = "";
140 トライ
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 休憩。
154 }
155 }
156 }
157 }
158 キャッチ(XmlException XML)
159 {
160 スロー XML;
161 }
162 戻り値 strReturn;
163 }
164 #エンドリージョン
165
166
167 指定したノードの値を読み取る #region 指定したノードの値を読み取る
168 /**//// <概要>
169 /// 関数:
170 /// 指定されたノードの値を読み取ります
171 /// </概要>
172 /// <param name="strNode">ノード名</param>
173 /// <リターン></リターン>
174 パブリック文字列 GetXmlNodeValue(文字列 strNode)
175 {
176 文字列 strReturn = 文字列.Empty;
177
178 トライ
179 {
180 //パスに基づいてノードを取得します
181 XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode);
182 if (!(xmlNode==null))
183 strReturn = xmlNode.InnerText;
184}
185 キャッチ(XmlException XML)
186 {
187 スロー XML;
188 }
189 戻り値 strReturn;
190 }
191 #エンドリージョン
192
193 ノード値の設定 #region ノード値の設定
194 /**//// <概要>
195 /// 機能:
196 /// ノード値を設定する
197 /// </概要>
198 /// <param name="strNode">ノードの名前</param>
199 /// <param name="newValue">ノード値</param>
200 パブリック void SetXmlNodeValue(string xmlNodePath,string xmlNodeValue)
201 {
202 試してみる
203 {
204 //条件を満たすノードに対して一括で支払うことができます。
205 XmlNodeList xmlNode=this.xmlDoc.SelectNodes(xmlNodePath);
206 if (!(xmlNode==null))
207 {
208 foreach(xmlNodeのXmlNode xn)
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 キャッチ(XmlException XML)
221 {
222 スロー XML;
223 }
224 }
225 #エンドリージョン
226
227 ノードの属性値を設定します #region ノードの属性値を設定します
228 /**//// <概要>
229 /// 関数:
230 ///ノードの属性値を設定する
231 /// </概要>
232 /// <param name="xmlNodePath">ノード名</param>
233 /// <param name="xmlNodeAttribute">属性名</param>
234 /// <param name="xmlNodeAttributeValue">属性値</param>
235 パブリック void SetXmlNodeAttributeValue(string xmlNodePath,string xmlNodeAttribute,string xmlNodeAttributeValue)
236 {
237 試してみる
238 {
239 //修飾されたノードの属性をバッチで支払うことができます
240 XmlNodeList xmlNode=this.xmlDoc.SelectNodes(xmlNodePath);
241 if (!(xmlNode==null))
242 {
243 foreach(xmlNodeのXmlNode xn)
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休憩。
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 266
267 休憩。
268 }
269}
270 }
271 */
272 }
273 キャッチ(XmlException XML)
274 {
275 スロー XML;
276 }
277 }
278 #エンドリージョン
279
280 #region の追加 追加
281 /**//// <概要>
282 /// XML ファイルのルート要素を取得します
283 /// </概要>
284 パブリック XmlNode GetXmlRoot()
285 {
286 戻り値 xmlDoc.DocumentElement;
287 }
288
289 /**//// <概要>
290 /// ルートノードの下に親ノードを追加します
291 /// </概要>
292 パブリックボイドAddParentNode(stringparentNode)
293 {
294 トライ
295 {
296 XmlNode ルート = GetXmlRoot();
297 XmlNode 親XmlNode = xmlDoc.CreateElement(parentNode);
298 ルート.AppendChild(parentXmlNode);
299 }
300 キャッチ(XmlException XML)
301 {
302 スロー XML;
303 }
304 }
305
306 /**//// <概要>
307 /// 子ノードを既存の親ノードに挿入します
308 /// </まとめ>
309 /// <param name="parentNodePath">親ノード</param>
310 /// <param name="childNodePath">バイトポイント名</param>
311 パブリック void AddChildNode(string 親ノードパス, 文字列子ノード名)
312 {
313 試してみる
314 {
315 XmlNode 親XmlNode = xmlDoc.SelectSingleNode(parentNodePath);
316 if(!((parentXmlNode)==null))//このノードが存在する場合
317 {
318 XmlNode childXmlNode = xmlDoc.CreateElement(childnodename);
319 親XmlNode.AppendChild(子XmlNode);
320 }
321 else{//存在しない場合は親ノードを追加します
322 //this.GetXmlRoot().AppendChild(childXmlNode);
323 }
324
325 }
326 キャッチ(XmlException XML)
327 {
328 スロー XML;
329 }
330 }
331
332 /**//// <概要>
333 /// ノードに属性を追加する
334 /// </まとめ>
335 /// <param name="NodePath">ノードパス</param>
336 /// <param name="NodeAttribute">属性名</param>
337 パブリックボイドAddAttribute(string NodePath, string NodeAttribute)
338 {
339 プライバシーの追加属性(ノードパス,ノード属性,"");
340 }
341 /**//// <概要>
342 ///
343 /// </まとめ>
344 /// <param name="NodePath"></param>
345 /// <param name="NodeAttribute"></param>
346 /// <param name="NodeAttributeValue"></param>
347 プライベートボイドプライベート追加属性(文字列ノードパス、文字列ノード属性、文字列ノード属性値)
348 {
349 試してみる
350{
351 XmlNode ノードパス = xmlDoc.SelectSingleNode(NodePath);
352 if (!(nodePath==null))
353 {
354 XmlAttribute ノード属性 = this.xmlDoc.CreateAttribute(NodeAttribute);
355 ノード属性.値=ノード属性値;
356 ノードパス.属性.Append(ノード属性);
357 }
358 }
359 キャッチ(XmlException XML)
360{
361 スロー XML;
362 }
363 }
364 /**//// <概要>
365 /// ノードに属性を追加し、値を支払う
366 /// </概要>
367 /// <param name="NodePath">ノード</param>
368 /// <param name="NodeAttribute">属性名</param>
369 /// <param name="NodeAttributeValue">属性値</param>
370 パブリック void AddAttribute(string NodePath, string NodeAttribute,string NodeAttributeValue)
371 {
372 372
373 }
374 #エンドリージョン
375
376 #region を削除 削除
377 /**//// <概要>
378 /// ノードの属性を削除します
379 /// </まとめ>
380 /// <param name="NodePath">ノードが配置されている xpath 式</param>
381 /// <param name="NodeAttribute">属性名</param>
382 パブリックボイド削除属性(文字列ノードパス、文字列ノード属性)
383 {
384 XmlNodeList ノードパス =this.xmlDoc.SelectNodes(NodePath);
385 if (!(nodePath==null))
386 {
387 foreach (nodePath の XmlNode tempxn)
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 テンプxn.Attributes.RemoveAt(i);
395休憩。
396 }
397 }
398 }
399 }
400 }
401
402 /**//// <概要>
403 /// 属性値が指定された値と等しい場合、ノードを削除します
404 /// </まとめ>
405 /// <param name="NodePath">ノードが配置されている xpath 式</param>
406 /// <param name="NodeAttribute">属性</param>
407 /// <param name="NodeAttributeValue">値</param>
408 パブリック void DeleteAttribute( string NodePath , string NodeAttribute , string NodeAttributeValue)
409 {
410 XmlNodeList ノードパス =this.xmlDoc.SelectNodes(NodePath);
411 if (!(nodePath==null))
412 {
413 foreach (nodePath の XmlNode tempxn)
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休憩。
422 }
423 }
424 }
425 }
426 }
427 /**//// <概要>
428 /// ノードを削除
429 /// </まとめ>
430 /// <param name="tempXmlNode"></param>
431 /// <コメント></コメント>
432 パブリックボイド削除XmlNode(string tempXmlNode){
433 XmlNodeList ノードパス =this.xmlDoc.SelectNodes(tempXmlNode);
434 if (!(nodePath==null))
435 {
436 foreach(nodePathのXmlNode xn)
437 {
438 xn.ParentNode.RemoveChild(xn);
439 }
440 }
441 }
442
443 #エンドリージョン
444
445 XML ドキュメント イベント#region XML ドキュメント イベント
446 /**//// <概要>
447 ///
448 /// </まとめ>
449 /// <param name="src"></param>
450 /// <param name="args"></param>
451 プライベートボイドnodeInsertEvent(Object src, XmlNodeChangedEventArgs args)
452 {
453 //設定を保存する
454 保存するXmlDocument();
455 }
456 /**//// <概要>
457 ///
458 /// </まとめ>
459 /// <param name="src"></param>
460 /// <param name="args"></param>
461 プライベートボイドnodeDeleteEvent(Object src, XmlNodeChangedEventArgs args)
462 {
463 //設定を保存する
464 保存するXmlDocument();
465 }
466 /**//// <概要>
467 ///
468 /// </まとめ>
469 /// <param name="src"></param>
470 /// <param name="args"></param>
471 プライベートボイドnodeUpdateEvent(Object src, XmlNodeChangedEventArgs args)
472 {
473 //設定を保存する
474 保存するXmlDocument();
475 }
476 #エンドリージョン
477
478 XML ファイルの保存 #region XML ファイルの保存
479 /**//// <概要>
480 /// 機能:
481 /// XML ファイルを保存
482 ///
483 /// </まとめ>
484 パブリック void SaveXmlDocument()
485 {
486 試してみる
487 {
488 //設定結果を保存する
489 if( this.xmlFilePathType == enumXmlPathType.AbsolutePath )
490 {
491 保存するxml(xmlファイルパス);
492 }
493 else if( this.xmlFilePathType == enumXmlPathType.VirtualPath )
494 {
495 Savexml(HttpContext.Current.Server.MapPath(xmlFilePath));
496 }
497 }
498 キャッチ(XmlException XML)
499 {
500 スロー XML;
501 }
502 }
503
504 /**//// <概要>
505 /// 関数:
506 /// XMLファイルを保存
507 /// </まとめ>
508 パブリック void SaveXmlDocument(string tempXMLFilePath)
509 {
510 トライ
511 {
512 //設定結果を保存する
513 保存するxml(tempXMLファイルパス);
514 }
515 キャッチ(XmlException XML)
516 {
517 スロー XML;
518 }
519 }
520 /**//// <概要>
521 ///
522 /// </まとめ>
523 /// <param name="ファイルパス"></param>
524 プライベート void Savexml(文字列ファイルパス)
525 {
526 xmlDoc.Save(ファイルパス);
527 }
528
529 #エンドリージョン
530
531 }
532
533}
534
535