合并两个带有一些条件的列表
本文关键字:条件 列表 两个 合并 | 更新日期: 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]
。
如何将lstSpecialEle
到lstTDElement
与权限列集成。在有条件的情况下使用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
将包含每行分隔的所有值。
希望它能帮助…:)