Как удалить узлы, отличные от определенных в массиве, используя LINQ - PullRequest
0 голосов
/ 09 мая 2019

Я новичок в использовании Linq to Xml, поэтому мою проблему, вероятно, очень легко решить.

Первый вопрос: Я хочу удалить все узлы, кроме тех, чьи имена у меня уже есть в массиве, используя Linq.

Второй вопрос: Как проверить, что это поле узла имеет три дочерних узла (имя, тип, значение) и удалить те поля, чьи требования не соответствуют?

Я уже сделал, удалив пустые узлы, но для этой проблемы у меня нет идей.

Заранее спасибо!

XDocument xml = XDocument.Load("test.xml");
           xml.Descendants().Where(e => string.IsNullOrEmpty(e.Value)).Remove();

           ArrayList permitted = new ArrayList { "object", "obj_name", "name", "field", "value", "type" };




HERE SOME XML OF THIS.
<object>
<obj_name>wolf</obj_name>
<field>
<name>color</name>
<type>string</type>
<value>grey</value>
</field>
<lolfield>lol"</lolfield> //for example this should be removed//
</object>

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

1. Следующий код помечает для удаления любые элементы xml, которые имеют пустое значение или имеют имя, содержащееся в массиве:

XDocument xml = XDocument.Load("test.xml");
ArrayList permitted = new ArrayList { "object", "obj_name", "name", "field", "value", "type" };
xml.Descendants().Where(e => string.IsNullOrEmpty(e.Value) || !permitted.Contains(e.Name.ToString().ToLower())).Remove();

e.Name.ToString() вернетполное имя элемента, включая пространство имен и локальное имя.Если для сравнения требуется только локальное имя, тогда используйте e.Name.LocalName.

2. И это будет специально предназначено для любых «полевых» элементов и убедитесь, что они содержат только запрошенные триимена (без дубликатов):

ArrayList permittedInField = new ArrayList { "name", "value", "type" };
foreach (XElement elField in xml.Descendants("field"))
    elField.Descendants().Where((e) => !permittedInField.Contains(e.Name.ToString().ToLower()) || 
        e.Parent.Elements().Any((o) => string.Equals(e.Name.ToString(), o.Name.ToString(), StringComparison.CurrentCultureIgnoreCase) && e.IsAfter(o)))
        .Remove();
0 голосов
/ 09 мая 2019

Вы можете сделать это, используя содержимое, подобное этому:

XDocument xml = XDocument.Load("test.xml");
        xml.Descendants().Where(e => string.IsNullOrEmpty(e.Value)).Remove();

        ArrayList permitted = new ArrayList { "object", "obj_name", "name", "field", "value", "type" };

        xml.Descendants().Where(e => permitted.Contains(e.Value)).Remove();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...