Поиск безымянного вложенного 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 выбирает все такие узлы. И тогда все выбранные узлы будут удалены.

Другие вопросы по тегам