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 Child1
elementu , a wszystkie elementy wnuków zostały usunięte z Child2
i z Child3
.