Language

XML ツリーから要素、属性、ノードを削除する (LINQ to XML)

要素、属性、およびその他の種類のノードを削除して、XML ツリーを変更できます。

1 つの要素または 1 つの属性は XML ドキュメントから簡単に削除できます。 一方、要素または属性のコレクションを削除する場合は、まずコレクションをリストに具体化し、そのリストから要素または属性を削除する必要があります。 最適な方法は、Remove 拡張メソッドを使用してこれを行うことです。

この方法を使用する主な理由は、XML ツリーから取得するコレクションのほとんどが遅延実行を使用して生成されるからです。 最初にコレクションをリストに具体化せず、拡張メソッドも使用しない場合、特定の種類のバグが発生する可能性があります。 詳細については、「宣言型コードと命令型コードの混在バグ」を参照してください。

ノードおよび属性を XML ツリーから削除するメソッドを次に示します。

メソッド 説明
XAttribute.Remove XAttribute をその親から削除します。
XContainer.RemoveNodes 子ノードを XContainer から削除します。
XElement.RemoveAll コンテンツおよび属性を XElement から削除します。
XElement.RemoveAttributes XElement の属性を削除します。
XElement.SetAttributeValue 値 null を渡す場合は、属性を削除します。
XElement.SetElementValue 値 null を渡す場合は、子要素を削除します。
XNode.Remove XNode をその親から削除します。
Extensions.Remove ソース コレクション内のすべての属性または要素をその親要素から削除します。

例: 1 つの要素を削除し、要素のコレクションを 2 つの方法で削除する

この例では、要素を削除する 3 つの方法を示します。 まず、1 つの要素を削除します。 次に、要素のコレクションを取得し、Enumerable.ToList 演算子を使用して要素を具体化してから、コレクションを削除します。 最後に、要素のコレクションを取得し、Remove 拡張メソッドを使用して要素を削除します。

ToList 演算子の詳細については、「データ型の変換 (C#)」と「データ型の変換 (Visual Basic)」を参照してください。

XElement root = XElement.Parse(@"<Root>
    <Child1>
        <GrandChild1/>
        <GrandChild2/>
        <GrandChild3/>
    </Child1>
    <Child2>
        <GrandChild4/>
        <GrandChild5/>
        <GrandChild6/>
    </Child2>
    <Child3>
        <GrandChild7/>
        <GrandChild8/>
        <GrandChild9/>
    </Child3>
</Root>");
root.Element("Child1").Element("GrandChild1").Remove();
root.Element("Child2").Elements().ToList().Remove();
root.Element("Child3").Elements().Remove();
Console.WriteLine(root);
Dim root As XElement = _
    <Root>
        <Child1>
            <GrandChild1/>
            <GrandChild2/>
            <GrandChild3/>
        </Child1>
        <Child2>
            <GrandChild4/>
            <GrandChild5/>
            <GrandChild6/>
        </Child2>
        <Child3>
            <GrandChild7/>
            <GrandChild8/>
            <GrandChild9/>
        </Child3>
    </Root>
root.<Child1>.<GrandChild1>.Remove()
root.<Child2>.Elements().ToList().Remove()
root.<Child3>.Elements().Remove()
Console.WriteLine(root)

この例を実行すると、次の出力が生成されます。

<Root>
  <Child1>
    <GrandChild2 />
    <GrandChild3 />
  </Child1>
  <Child2 />
  <Child3 />
</Root>

最初の孫要素が Child1 から削除され、すべての孫要素が Child2 と Child3 から削除されました。