Удаление элементов, атрибутов и узлов из дерева 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
, и все элементы внуков были удалены из и из Child2
Child3
него.