從 XML 樹狀結構中移除項目、屬性和節點 (LINQ to XML)

您可以修改 XML 樹狀以移除項目、屬性以及其他類型的節點。

從 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 從其父元素移除來源集合中的每個屬性或元素。

範例:移除單一元素,並以兩種方式移除元素的集合

這個範例會示範三種移除項目的方法。 首先,它會移除單一項目。 接著,它會擷取元素的集合,使用 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 中移除。