Метод расширения:
public static class Extensions
{
public static void CleanNil(this XElement value)
{
value.DescendantsAndSelf().Where(x => x.Attribute("nil") != null && x.Attribute("nil").Value == "true").Remove();
}
}
Пример использования:
File.WriteAllText("test.xml", @"
<Root nil=""false"">
<a nil=""true""></a>
<b>2</b>
<c nil=""false"">
<d nil=""true""></d>
<e nil=""false"">4</e>
</c>
</Root>");
var root = XElement.Load("test.xml");
root.CleanNil();
Console.WriteLine(root);
Выход:
<Root nil="false">
<b>2</b>
<c nil="false">
<e nil="false">4</e>
</c>
</Root>
Как видите, узлы <a>
и <d>
были удалены, как и ожидалось. Единственное, на что следует обратить внимание, это то, что вы не можете вызвать этот метод на узле <Root>
, поскольку корневой узел не может быть удален, и вы получите эту ошибку времени выполнения:
Родитель отсутствует.