从 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
中删除了第一个孙元素,从 Child2
和 Child3
中删除了所有孙元素。