从 XML 树中移除元素、特性和节点 (LINQ to XML)

可以修改 XML 树,移除元素、属性和其他类型的节点。

从 XML 文档中移除单个元素或单个属性的操作非常简单。 但是,若要移除多个元素或属性的集合,则应首先将一个集合具体化为一个列表,然后从该列表中删除相应元素或属性。 最好的方法是使用 Remove 扩展方法来做到这一点。

使用此方法的主要原因在于,从 XML 树检索的大多数集合都是用延迟执行生成的。 如果你不首先将它们具体化为列表,或者如果你不使用扩展方法,你可能会遇到某一类 bug。 有关详细信息,请参阅混合声明式/命令式代码 bug

下列方法可以从 XML 树中移除节点和属性。

方法 说明
XAttribute.Remove 从父节点中移除 XAttribute
XContainer.RemoveNodes XContainer 中移除子节点。
XElement.RemoveAll XElement 中移除内容和属性。
XElement.RemoveAttributes 移除 XElement 的属性。
XElement.SetAttributeValue 如果传递值 null,则删除该属性。
XElement.SetElementValue 如果传递值 null,则删除子元素。
XNode.Remove 从父节点中移除 XNode
Extensions.Remove 从父元素中移除源集合中的每个属性或元素。

示例:可以通过两种方式来删除单个元素并删除元素集合

此示例演示三种移除元素的方法。 第一种,移除单个元素。 第二种,检索元素的集合,使用 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 中删除了第一个孙元素,从 Child2Child3 中删除了所有孙元素。