2015-01-27 5 views
4

Я создал XElement с узлом, который имеет XML, как показано ниже.Как удалить определенные узлы из XElement?

Я хочу, чтобы удалить все «Правило» узлы, если они содержат «условия» узел.

Я создаю для цикла, как показано ниже, но не удаляет мои узлы

foreach (XElement xx in xRelation.Elements()) 
{ 
    if (xx.Element("Conditions") != null) 
    { 
    xx.Remove(); 
    } 
} 

Пример:

<Rules effectNode="2" attribute="ability" iteration="1"> 
    <Rule cause="Cause1" effect="I"> 
     <Conditions> 
     <Condition node="1" type="Internal" /> 
     </Conditions> 
    </Rule> 
    <Rule cause="cause2" effect="I"> 
     <Conditions> 
     <Condition node="1" type="External" /> 
     </Conditions> 
    </Rule> 
</Rules> 

Как я могу удалить все «Правило» узлы, если они содержат «условия« узел?

+0

вы не можете перебирать правила Elemen ts с foreach при удалении элементов. скорее, вы можете собирать их в списке и использовать итерацию для цикла и удалять их. –

ответ

10

Вы можете попробовать этот подход:

var nodes = xRelation.Elements().Where(x => x.Element("Conditions") != null).ToList(); 

foreach(var node in nodes) 
    node.Remove(); 

Основная идея: вы не можете удалять элементы коллекции вы в настоящее время переборе.
Итак, сначала вам нужно создать список узлов для удаления, а затем удалить эти узлы.

2

Я сделал небольшой пример для вас:

XDocument document = XDocument.Parse(GetXml()); 
var rulesNode = document.Element("Rules"); 
if (rulesNode != null) 
{ 
    rulesNode.Elements("Rule").Where(r => r.Element("Conditions") != null).Remove(); 
} 
4

Вы можете использовать Linq:

xRelation.Elements() 
    .Where(el => el.Elements("Conditions") == null) 
    .Remove(); 

Или создать копию узлов для удаления и удалить их после того, как (в случае, если первый способ не работает):

List nodesToDelete = xRelation.Elements().Where(el => el.Elements("Conditions") == null).ToList(); 

foreach (XElement el in nodesToDeletes) 
{ 
    // Removes from its parent, but not nodesToDelete, so we can use foreach here 
    el.Remove(); 
} 
2
passiveLead.DataXml.Descendants("Conditions").Remove(); 
+2

Можете ли вы добавить дополнительные пояснения или ссылки для OP и будущих читателей? –

Смежные вопросы