代码之家  ›  专栏  ›  技术社区  ›  Alex Gordon

如何遍历节点的交集

  •  0
  • Alex Gordon  · 技术社区  · 7 年前

    如何只遍历两个文档之间的公共节点?

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

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

    交叉点 节点主义者 和 xdoc 将只是这些节点: 名称、颜色 :

    foreach(XElement child in xdoc.Elements().Intersect(nodeList))
    
    0 回复  |  直到 7 年前
        1
  •  2
  •   juharr    7 年前

    您可能应该使用 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.
    }
    
        2
  •  1
  •   Zachary Schroeder    7 年前

    我将使用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: ...