LINQ to XMLでの要素の削除について.
過去の内容は以下から見れます。よろしければご参照くださいませ。
XElementには、要素の削除を行うためのメソッドがいくつか存在します。
Remove()
RemoveAll()
RemoveNodes()
SetElementValue(XName, object)
元定義は以下のようになっています。
XNode.Remove()
XElement.RemoveAll()
XContainer.RemoveNodes()
XElement.SetElementValue(XName, object)
RemoveAllメソッドは、属性まで削除する点に注意。
逆にRemoveNodesメソッドは、子要素を削除しますが、属性は削除しません。
上記のメソッドの中でSetElementValueメソッドのみが
ちょっと特殊です。このメソッドは、自分自身ではなく
子要素の値を更新します。その際
- 要素が存在する場合は、その要素の値を更新
- 要素が存在しない場合は、新たに要素を作成
- 値にnullを設定した場合は、子要素を削除
という動きになります。
以下、サンプルです。
#region LinqSamples-62 /// <summary> /// LINQ to XMLのサンプルです. /// </summary> /// <remarks> /// 要素削除系メソッドのサンプルです. /// </remarks> public class LinqSamples62 : IExecutable { public void Execute() { // // Remove() // 現在の要素をXMLツリーより削除する. // var root = BuildSampleXml(); var elem = root.Descendants("Value").First(); elem.Remove(); Console.WriteLine(root); Console.WriteLine("====================================="); // // RemoveAll() // 現在の要素から子ノード及び属性を削除する. // 属性まで削除される点に注意。 // root = BuildSampleXml(); elem = root.Elements("Child").First(); elem.RemoveAll(); Console.WriteLine(root); Console.WriteLine("====================================="); // // RemoveNodes() // 現在の要素から子ノードを削除する // RemoveAllメソッドと違い、属性は削除されない // root = BuildSampleXml(); elem = root.Elements("Child").First(); elem.RemoveNodes(); Console.WriteLine(root); Console.WriteLine("====================================="); // // SetElementValue(XName, object) // 本来は、子要素の値を設定するためのメソッドであるが // 要素の値にnullを設定することで削除することが出来る // root = BuildSampleXml(); elem = root.Elements("Child").First(); elem.SetElementValue("Value", null); Console.WriteLine(root); Console.WriteLine("====================================="); } XElement BuildSampleXml() { return XElement.Parse("<Root><Child Id=\"100\"><Value>hoge</Value></Child></Root>"); } } #endregion
実行すると以下のようになります。
===================================== ===================================== ===================================== =====================================
以下、参考リソースです.
- XNode.Remove メソッド
- XElement.RemoveAll メソッド
- XContainer.RemoveNodes メソッド
- XElement.SetElementValue メソッド
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場