2016-07-29 11 views
2

テーブルからデータを取得しますが、値は操作しにくいことがわかります。条件付きで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> 

しかし、私は取得しようとしたときのようなデータは次のようになります。

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

それを:私はこのコードを使用していた

10Good LuckNowadayhookzp

多くの行が作成されます(<tr>タグで約60 00)、正しい列をどのように配置するのか分かりません。

各列のデータはnullである可能性があります。

現在、lstTDElementには2つの列(実際には10列)が含まれています。

lstSpecialEleには、必要なすべてのデータが含まれています。 私はフィルターをつけただけです:[//td/span | //td/b | //td/p]

lstSpecialElelstTDElementの権利列をどのように統合するか。条件付きのforeachを使用しますか?

編集:

典型的な、私はlstTDElementから受信するには、次のとおりです。10Good LuckNowadayhookzp

lstSpecialEle多くの行には必要なすべての値が含まれます。

問題は次のとおりです。lstSpecialEleからテーブルにすべての行を配置する方法がわかりません。

私のテーブルには2つの<tr>タグがあります。つまり、2つの列があります。 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: - あなたは以下のようにしてみてください文字列の1つのリストにすべての列のテキストリストマージしたい場合: -

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には、1行ごとに区切られたすべての値が含まれます。

希望します。:)

+0

はい、XPath要素の前に '.'を追加し、6000行から16-> 30行に制限します。データは動的なので、 '.// td/span'や' .// td/b'の正確な数はわかりません。列Xにある可能性があるため、データはありません。行nullに特殊文字を挿入するような考えはありませんか?これを行うには、列に行が含まれていることを知る必要があります。 – vanloc

+0

@VănLộcあなたはあなたが望むヌルと正確な要素の組み合わせでリストを持っていることを意味します。右?? –

+0

@VănLộc私はあなたが単純にそれをヌル状態でフィルタリングしてサブリストを得ることができればいいですか?更新された回答をご覧ください。うまくいくと思います... :) –

関連する問題