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


Удаление элементов, атрибутов и узлов из XML-дерева

Обновлен: November 2007

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

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

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

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

Метод

Описание

[M:System.Xml.Linq.XAttribute.Remove()]

Удаляет XAttribute из его родительского элемента.

[M:System.Xml.Linq.XContainer.RemoveNodes()]

Удаляет дочерние узлы из XContainer.

XElement.RemoveAll

Удаляет содержимое и атрибуты из XElement.

XElement.RemoveAttributes

Удаляет атрибуты XElement.

XElement.SetAttributeValue

Передача null в качестве значения приводит к удалению атрибута.

XElement.SetElementValue

Передача null в качестве значения приводит к удалению дочернего элемента.

XNode.Remove

Удаляет XNode из его родительского элемента.

Extensions.Remove

Удаляет каждый атрибут или элемент исходной коллекции из своего родительского элемента.

Пример

Описание

В этом примере показано три подхода к удалению элементов. Сначала удаляется одиночный элемент. Затем он возвращает коллекцию элементов, материализует их с помощью оператора Enumerable.ToList<TSource> и удаляет коллекцию. Наконец, он получает коллекцию элементов и удаляет их с помощью метода расширения Remove.

Дополнительные сведения об операторе ToList<TSource> см. в разделе Преобразование типов данных.

Код

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. Все внучатые элементы были удалены из Child2 и Child3.

См. также

Другие ресурсы

Изменение XML-деревьев (LINQ to XML)