代码之家  ›  专栏  ›  技术社区  ›  jamlot

c#基于数组或列表搜索XML元素值

  •  0
  • jamlot  · 技术社区  · 7 年前

    我的代码将创建一个名为“TrackFileId”的所有XML元素值的数组:

    XDocument cpldoc = XDocument.Load(cplsource);
    
    var cpltfid = cpldoc.Descendants(cplns + "TrackFileId").ToArray();
    

    然后,我需要递归地在多个父目录(最多3级)中搜索任何名为“ASSETMAP.xml”的文件,并解析它们以查找数组中具有匹配值的任何元素。

    我还没有弄清楚如何从起始目录(变量“folder”)中指定[n]个目录。然而,以下是我如何在与“folder”相同的目录中查找ASSETMAP的方法,它可以工作:

    string assetmap = Directory.GetFiles(folder, "*ASSETMAP*")[0].ToString();
    

    一旦我找到所有资产负债表。xml文档中,我需要循环遍历其中的每个“Id”元素,以从数组中找到任何匹配的值,但我无法让它工作,因为它似乎只是查找数组中的第一个项并放弃。在这种情况下,数组中的第一个值不匹配,因此bool为false。

    XDocument assetmapdoc = XDocument.Load(assetmap);
    
    bool cpltfidfound = false;
    
    foreach (var assetC in assetElements)
    {
        var innerElementsC = assetC.Descendants(assetns + "Id").First();
    
        if (!innerElementsC.Value.Equals(cpltfid))
            continue;
        cpltfidfound = true;
    }
    
        if (cpltfidfound)
        {
           //do something
        }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   jamlot    7 年前

    已解决

    关键是 Array.Exists 。我尚未添加递归搜索,但这将处理数组搜索:

    foreach (var assetC in assetElements)
    {
       var innerElementsC = assetC.Descendants(assetns + "Id").FirstOrDefault().Value;
    
       if (Array.Exists(cpltfids, element => element.Value == (innerElementsC)))
       {
           MessageBox.Show("MATCH");
       }
       else
       {
           MessageBox.Show("NO MATCH");
       }