Sdílet prostřednictvím


Odebrání elementů, atributů a uzlů ze stromu XML (LINQ to XML)

Strom XML můžete upravit, odebrat prvky, atributy a další typy uzlů.

Odebrání jednoho prvku nebo jednoho atributu z dokumentu XML je jednoduché. Při odebírání kolekcí prvků nebo atributů byste ale měli nejprve materializovat kolekci do seznamu a potom odstranit prvky nebo atributy ze seznamu. Nejlepším přístupem je použít k tomu metodu Remove rozšíření.

Hlavním důvodem použití tohoto přístupu je to, že většina kolekcí, které načítáte ze stromu XML, se získává pomocí odloženého spuštění. Pokud je nejdříve materializujete do seznamu nebo pokud nepoužíváte rozšiřující metody, můžete narazit na určitou třídu chyb. Další informace naleznete v tématu Smíšené deklarativní nebo imperativní chyby kódu.

Následující metody odeberou uzly a atributy ze stromu XML.

metoda Popis
XAttribute.Remove Odeberte z nadřazeného objektu XAttribute .
XContainer.RemoveNodes Odeberte podřízené uzly z objektu XContainer.
XElement.RemoveAll Odeberte obsah a atributy z objektu XElement.
XElement.RemoveAttributes Odeberte atributy objektu XElement.
XElement.SetAttributeValue Odeberte atribut, pokud předáte hodnotu null.
XElement.SetElementValue Odeberte podřízený prvek, pokud předáte hodnotu null.
XNode.Remove Odeberte z nadřazeného objektu XNode .
Extensions.Remove Odeberte všechny atributy nebo elementy ve zdrojové kolekci z nadřazeného prvku.

Příklad: Odebrání jednoho prvku a odebrání kolekce prvků dvěma způsoby

Tento příklad ukazuje tři přístupy k odebrání prvků. Nejprve odebere jeden prvek. Za druhé načte kolekci prvků, materializuje je pomocí operátoru Enumerable.ToList a pak kolekci odebere. Nakonec načte kolekci prvků a odebere je pomocí Remove metody rozšíření.

Další informace o operátoru ToList naleznete v tématu Převod datových typů (C#) a Převod datových typů (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)

Tento příklad vytvoří následující výstup:

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

První prvek vnoučata byl odebrán z Child1, a všechny prvky vnoučata byly odebrány z Child2 a z Child3.