Удаление элементов, атрибутов и узлов из 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. |
|
Удаляет атрибуты XElement. |
|
Передача null в качестве значения приводит к удалению атрибута. |
|
Передача null в качестве значения приводит к удалению дочернего элемента. |
|
Удаляет XNode из его родительского элемента. |
|
Удаляет каждый атрибут или элемент исходной коллекции из своего родительского элемента. |
Пример
Описание
В этом примере показано три подхода к удалению элементов. Сначала удаляется одиночный элемент. Затем он возвращает коллекцию элементов, материализует их с помощью оператора 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.