2016-07-29 42 views
2

我从表中获取数据,但数值显示不易操纵。用一些条件合并两个列表

我的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")); 
} 

它会创建很多行(在<tr>标签中我找到了大约60个00),我不知道如何安排正确的列。

因为每一列的数据都可以为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>加)

回答

1

其实你是从根本手段使用//在你的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(); 

Edited2: - 如果要合并的所有列文本列表转换成单独的列表字符串如下尝试​​: -

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将包含按行分隔的所有值。

希望它能帮助... :)

+0

是的,我的XPath元素前加'.',并限制从6000行16 - > 30行。而且数据是动态的,所以我无法确切知道'.td/span'或者'.d/t'的数量。因为可以在X列没有任何数据。有任何想法像在行中插入特殊字符null。为此,我们需要知道列包含行。 – vanloc

+0

@VănLộc你意味着你已经得到了你想要的null和exact元素组合的列表。对?? –

+0

@VănLộc如果我是对的,你可以简单地过滤它为null条件并获得子列表。查看更新的答案。希望它的作品... :) –