Поиск безымянного вложенного XElement по определенному XAttribute
Вот как выглядит мой XML (да, я знаю, что XML уродлив). Я пытаюсь найти и удалить любые узлы из этого XDocument, у которых атрибут isConstField имеет значение "Y", без перебора каждого отдельного XElement.
<Root>
<Node>
<SubNode>
<SubNode2>
<FieldNameA isConstField="Y"></FieldNameA>
<FieldNameB></FieldNameB>
<FieldNameC isConstField="N"></FieldNameC>
</SubNode2>
</SubNode>
<SubNode>
<SubNode2>
<FieldNameD></FieldNameD>
<FieldNameE></FieldNameE>
<FieldNameF></FieldNameF>
</SubNode2>
</SubNode>
</Node>
</Root>
Вот как я пытаюсь это сделать
XDocument doc = XDocument.Load(@"d:\junk\Test\Test\Data.xml");
doc.Descendants("Root").Elements().Where(x => (string)x.Attribute("isConstField") == "Y").Remove();
2 ответа
.Elements()
будет возвращать только прямые дочерние элементы.
Ты хочешь .Descendants()
, который возвращает все вложенные элементы.
Вы можете сделать это с помощью расширений XPath (не забудьте добавить System.Xml.XPath
ссылка на пространство имен):
doc.XPathSelectElements("//*[@isConstField='Y']").Remove();
Выражение соответствует любому узлу, который имеет isConstField
атрибут равен Y
, XPathSelectElements
выбирает все такие узлы. И тогда все выбранные узлы будут удалены.