从 XML 树中移除元素、属性和节点

更新:November 2007

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

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

这么做的主要原因在于,从 XML 树检索的大多数集合都是用延迟执行生成的。 如果不首先将集合具体化为列表,或者不使用扩展方法,则可能会遇到某类 Bug。 有关更多信息,请参见混合声明性代码/命令性代码的问题 (C#) (LINQ to XML)

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

方法

说明

[M:System.Xml.Linq.XAttribute.Remove()]

从父属性中移除 XAttribute

[M:System.Xml.Linq.XContainer.RemoveNodes()]

XContainer 中移除子节点。

XElement.RemoveAll

XElement 中移除内容和属性。

XElement.RemoveAttributes

移除 XElement 的属性。

XElement.SetAttributeValue

如果传递 null 作为值,则移除该属性。

XElement.SetElementValue

如果传递 null 作为值,则移除该子元素。

XNode.Remove

从父节点中移除 XNode

Extensions.Remove

从父元素中移除源集合中的每个属性或元素。

示例

说明

此示例演示三种移除元素的方法。 第一种,移除单个元素。 第二种,检索元素的集合,使用 Enumerable.ToList<TSource> 运算符将它们具体化,然后移除集合。 最后一种,检索元素的集合,使用 Remove 扩展方法移除元素。

有关 ToList<TSource> 运算符的更多信息,请参见转换数据类型

代码

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 中移除。

请参见

其他资源

修改 XML 树 (LINQ to XML)