如何通过节点的交集进行迭代

时间:2019-03-05 16:10:10

标签: c# .net xml xsd xelement

如何仅通过两个文档之间的公共节点进行迭代?

现在,我可以遍历文档的所有节点:

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" };

nodeListxdoc的交集就是这些节点:名称,颜色

我该如何针对交叉路口进行迭代

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

2 个答案:

答案 0 :(得分:2)

您可能应该使用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 :(得分:1)

我会这样使用Linq Where和Contains:

        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: ...