2016-07-29 8 views
2

Ich bekomme Daten aus einer Tabelle, aber Werte zeigen nicht einfach zu manipulieren.Merge zwei Liste mit einigen bedingten

Meine HTML-Struktur wie:

<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> 

Aber als ich versuchte, Daten zu bekommen wie:

10Good LuckNowadayhookzp

ich diesen Code wurde mit:

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

Es erstellt viele Zeilen (in einem <tr> Tag habe ich etwa 60 gefunden 00), und ich weiß nicht, wie man mit richtigen Spalten arrangiert.

Da jede Spalte Daten kann Null sein oder viele Werte in diesem haben.

Strom, ich habe lstTDElement enthält zwei Spalten (in Wirklichkeit: 10 Spalten).

Und lstSpecialEle enthält alle erforderlichen Daten. Ich war Filter nur mit bekommen: [//td/span | //td/b | //td/p].

So integrieren Sie lstSpecialEle zu lstTDElement mit Rechte-Spalten. Verwenden Sie foreach mit der Bedingung?

Edited:

Typisch, werde ich von lstTDElement erhalten ist: 10Good LuckNowadayhookzp.

lstSpecialEle erstellt viele Zeilen enthält alle Werte, die ich brauche.

Das Problem ist: Ich weiß nicht, wie Sie alle Zeilen von lstSpecialEle in einer Tabelle anordnen.

Meine Tabelle hat zwei <tr> Tag; Das bedeutet, dass es zwei Spalten hat. Wie organisiert man alle Werte in lstSpecialEle richtig zu diesen Spalten.

Es sollte wie sein:

 Num      Time 
1 0 Good Luck    Nowaday hookzp 

Wie bereits erwähnt, Daten dynamisch ist, erste <tr> oder zweite <tr> nicht Tag wie <span> haben kann, oder haben nicht Tag <b>, usw. (es scheint einfach nicht keine neuen <tag> hinzugefügt)

Antwort

1

Eigentlich sind Sie Element von der Wurzel zu finden, bedeutet // in Ihrem XPath, die für Elemente in der gesamten Seite suchen, während Sie nur innerhalb der bestimmten Zeile Element suchen müssen, so dass Sie mitversuchen sollten,in Ihrem xpath, der nach Elementen nur spezifischen Elementkontext sucht.Deshalb denke ich, sollten Sie versuchen, wie unten denen Sie gibt nur Liste Wunsch Elemente statt große Menge von Elementen Liste wie folgt:

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: Wenn immer die Liste der Elemente mit der Kombination von null Text kann es mit null Bedingung filtern und Teil-Listen erhalten, die, wie unten genauer Text enthält: -

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

Edited2 - wenn Sie wollen, dass alle Spalten Textliste in Einzel Liste der Zeichenfolge, wie unten versuchen, fusionieren: -

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

Jetzt enthält alle Werte, die nach Zeilen getrennt sind.

Hoffe, es hilft ... :)

+0

Ja, ich hinzufügen '.' vor XPath Element und von 6000 Zeilen auf 16 begrenzen -> 30 Zeilen. Und Daten sind dynamisch, daher kann ich nicht die genaue Anzahl von '.// td/span' oder' .// td/b' wissen. Da können bei Spalten X keine Daten vorhanden sein. Haben Sie eine Idee wie Sonderzeichen in Zeilen null einfügen. Um dies zu tun, müssen wir wissen, dass Spalten Zeilen enthalten. – vanloc

+0

@ VănLộc Sie bedeutet, Sie haben die Liste mit der Kombination von Null und genaues Element, das Sie wollen. Recht?? –

+0

@ VănLộc Wenn ich richtig bin, können Sie es einfach mit null Bedingung filtern und Unterliste erhalten. Siehe aktualisierte Antwort. Hoffe, es funktioniert ... :) –