Usuwanie elementów, atrybutów i węzłów z drzewa XML (LINQ to XML)

Możesz zmodyfikować drzewo XML, usunąć elementy, atrybuty i inne typy węzłów.

Usuwanie pojedynczego elementu lub pojedynczego atrybutu z dokumentu XML jest proste. Jednak podczas usuwania kolekcji elementów lub atrybutów należy najpierw zmaterializować kolekcję na liście, a następnie usunąć elementy lub atrybuty z listy. Najlepszym rozwiązaniem jest użycie Remove metody rozszerzenia w tym celu.

Głównym powodem użycia tego podejścia jest to, że większość kolekcji pobieranych z drzewa XML jest zwracana przy użyciu odroczonego wykonywania. Jeśli nie najpierw zmaterializujesz je na liście lub jeśli nie używasz metod rozszerzeń, możesz napotkać określoną klasę usterek. Aby uzyskać więcej informacji, zobacz Mieszane błędy kodu deklaratywnego/imperatywnego.

Poniższe metody usuwają węzły i atrybuty z drzewa XML.

Metoda opis
XAttribute.Remove Usuń element XAttribute z elementu nadrzędnego.
XContainer.RemoveNodes Usuń węzły podrzędne z elementu XContainer.
XElement.RemoveAll Usuń zawartość i atrybuty z elementu XElement.
XElement.RemoveAttributes Usuń atrybuty elementu XElement.
XElement.SetAttributeValue Usuń atrybut, jeśli przekażesz wartość null.
XElement.SetElementValue Usuń element podrzędny, jeśli przekażesz wartość null.
XNode.Remove Usuń element XNode z elementu nadrzędnego.
Extensions.Remove Usuń każdy atrybut lub element w kolekcji źródłowej z jego elementu nadrzędnego.

Przykład: usuwanie pojedynczego elementu i usuwanie kolekcji elementów na dwa sposoby

W tym przykładzie pokazano trzy podejścia do usuwania elementów. Najpierw usuwa pojedynczy element. Po drugie pobiera kolekcję elementów, materializuje je przy użyciu Enumerable.ToList operatora, a następnie usuwa kolekcję. Na koniec pobiera kolekcję elementów i usuwa je przy użyciu Remove metody rozszerzenia.

Aby uzyskać więcej informacji na ToList temat operatora, zobacz Konwertowanie typów danych (C#) i konwertowanie typów danych (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)

Ten przykład generuje następujące wyniki:

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

Pierwszy element wnuka został usunięty z Child1elementu , a wszystkie elementy wnuków zostały usunięte z Child2 i z Child3.