合并两个带有一些条件的列表

本文关键字:条件 列表 两个 合并 | 更新日期: 2023-09-27 17:59:18

我从表中获取数据,但值显示不易操作。

我的HTML结构像:

<table>
  <tbody>
    <tr>
       <td>
          <span>1</span>
          <span>0</span>
          <br>
          <span>
            <span>Good Luck</span>
            <img src="/App_Themes/Resources/img/icon_tick.gif" width="3" height="7">
          </span>
       </td>
    </tr>
    <tr>
      <td>
        <b>Nowaday<br></b>
        <p>hook<br>zp</p>
      </td>
    </tr>
  </tbody>
</table>

但当我试图获得数据时,会像:

10Good LuckNowadayhookzp

我用的是这个代码:

ReadOnlyCollection<IWebElement> lstTable = browser.FindElements(By.XPath("table/tbody/tr"));
foreach (IWebElement val in lstTable)
{
     ReadOnlyCollection<IWebElement> lstTDElement = val.FindElements(By.XPath("td"));
     ReadOnlyCollection<IWebElement> lstSpecialEle = 
                          val.FindElements(By.XPath("//td/span | //td/b | //td/p"));
}

它将创建许多行(在我发现的大约6000个<tr>标签中),并且我不知道如何使用正确的列进行排列。

因为每一列中的数据都可以为null,或者其中有许多值。

目前,我有lstTDElement包含两列(实际:10列)。

并且lstSpecialEle包含所有必需的数据。我是过滤器只得到:[//td/span | //td/b | //td/p]

如何将lstSpecialElelstTDElement与权限列集成。在有条件的情况下使用foreach

编辑:

通常,我从lstTDElement收到的是:10Good LuckNowadayhookzp

lstSpecialEle将创建许多行,其中包含我需要的所有值。

问题是:我不知道如何将lstSpecialEle中的所有行排列到一个表中。

我的桌子上有两个<tr>标签;这意味着它有两列。如何将lstSpecialEle中的所有值组织为此列进行更正。

应该是这样的:

     Num                       Time
1 0 Good Luck             Nowaday hookzp

如上所述,数据是动态的,第一个<tr>或第二个<tr>不能有像<span>这样的标签,或者没有标签<b>等(它只是没有出现,没有添加新的<tag>

合并两个带有一些条件的列表

实际上,您从根目录中查找元素意味着在您的xpath中使用//,它将搜索整个页面中的元素,而您只需要在特定的行元素中进行搜索,因此您应该在xpath中尝试使用.//,它将只搜索特定的元素上下文中的元素。所以我认为你应该尝试如下,这将只给你想要的元素列表,而不是下面的大量元素列表:

ReadOnlyCollection<IWebElement> lstTable = browser.FindElements(By.XPath("//table/tbody/tr"));
foreach (IWebElement val in lstTable)
{
  ReadOnlyCollection<IWebElement> lstSpecialEle = val.FindElements(By.XPath(".//td/span | .//td/b | .//td/p"));
}

Edited1:如果您正在获取包含空文本组合的元素列表,则可以使用空条件对其进行筛选,并获取包含确切文本的子列表,如下所示:-

var FinalList = lstSpecialEle.Where(x=>x.Text != null).ToList();

编辑2:-如果您想将所有列的文本列表合并到字符串的单个列表中,请尝试如下:-

List<string> FinalList = new List <string>();
foreach (IWebElement val in lstTable)
{
    ReadOnlyCollection<IWebElement> lstSpecialEle = val.FindElements(By.XPath(".//td/span | .//td/b | .//td/p"));
    var AllTextList = lstSpecialEle.Where(x=>x.Text != null).ToList().Select(El => El.Text).ToList();
     string AllText = String.Join(" ", AllTextList);
     FinalList.Add(AllText);       
}
Console.WriteLine(FinalList);

现在FinalList将包含每行分隔的所有值。

希望它能帮助…:)