Поделиться через


Удаление элементов, атрибутов и узлов из дерева XML (LINQ to XML)

Можно вносить изменения в XML-дерево, удаляя элементы, атрибуты и узлы других типов.

Удаление одного элемента или атрибута из XML-документа является простой операцией. Но при удалении коллекций элементов или атрибутов необходимо вначале материализовать коллекцию в список, а затем удалить элементы или атрибуты из списка. Лучший Remove подход — использовать метод расширения для этого.

Основной причиной этого подхода является то, что большинство коллекций, извлеченных из дерева XML, получаются с помощью отложенного выполнения. Если вы не сначала материализуете их в список или не используете методы расширения, может возникнуть определенный класс ошибок. Дополнительные сведения см. в статье об ошибках смешанного декларативного и императивного кода.

Следующие методы позволяют удалять узлы и атрибуты из XML-дерева.

Метод Description
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него.