как перебрать пересечение узлов - PullRequest
0 голосов
/ 05 марта 2019

Как я могу перебирать только общие узлы между двумя документами?

Сейчас я могу перебрать все узлы моего документа:

var xmlBody = @"<?xml version="1.0" encoding="UTF-8"?>
<Visit>
   <Person>...</Person>
   <Name>...</Name>
   <Color>...</Color>
</Visit>";
    var xdoc = XDocument.Parse(xmlBody);
    foreach (XElement child in xdoc.Elements())
                {//do stuff}

Я хотел бы ТОЛЬКО перебирать общие узлы между xdoc.Elements() и моим nodeList:

var nodeList = new List<string> { "Name", "LastName", "Color" };

Пересечение nodeList и xdoc было бы именно этими узлами: Имя, Цвет :

Как я могу перебрать пересечение, что-то вроде этого

foreach(XElement child in xdoc.Elements().Intersect(nodeList))

Ответы [ 2 ]

2 голосов
/ 05 марта 2019

Вместо списка вы, вероятно, должны использовать HashSet, тогда вы можете использовать следующий Linq для фильтрации узлов на основе локального имени

var nodeNames = new HashSet<string> { "Name", "LastName", "Color" };

foreach(var child in xdoc.Elements().Where(e => nodeNames.Contains(e.Name.LocalName)))
{
    // Your code here.
}
1 голос
/ 05 марта 2019

Я бы использовал Linq Где и Содержит вот так:

        var xmlBody = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<Visit>
   <Person>...</Person>
   <Name>...</Name>
   <Color>...</Color>
</Visit>";
        var xdoc = XDocument.Parse(xmlBody);
        var nodeList = new List<string> { "Name", "LastName", "Color" };

        var intersectedElements = xdoc.Elements()
            .First() //<Visit>
            .Elements()
            .Where(element => nodeList.Contains(element.Name.LocalName));

        foreach (XElement child in intersectedElements)
        {
            Console.WriteLine($"{child.Name.LocalName}: {child.Value}");
        }

Если вы хотите, чтобы элементы могли быть вложены глубже, чем используйте потомки.

        var intersectedNestedElements = xdoc.Descendants()
            .Where(element => nodeList.Contains(element.Name.LocalName));

        foreach (XElement child in intersectedNestedElements)
        {
            Console.WriteLine($"{child.Name.LocalName}: {child.Value}");
        }

Оба выхода:

Name: ...
Color: ...
...