Hallo Leute,
Ich hab hier ein kleines Problem. Muß ne Website parsen und auswerten, da die Website aber automatisch erstellt wird, und ich auf die Erstellung keinen Einfluss habe, und deren Datenstruktur, sehr... gewöhnungsbedürftig ist - muß ich n bischen tricksen.
Im Moment, habe ich eine eine foreach Anweisung, die sämtliche Elemente, die mir die bibliothek mshtml zurückliefert durchiteriere, aber aufgrund der fehlenden struktur der webpage muß ich einen spezialfall abfangen.
Ich werte eine Tabelle aus, und dort gibt es Felder, die leer sein können, aber nur dann, wenn das nachbarfeld kein image hat.
Ihr versteht jetzt bestimmt, das beim befüllen, der datatable, ich jetzt in der bredoiulle stecke, da ich prüfen muß, ob das nachbarfeld, ein image hat, kann das aber über die foreach noch nicht abfangen, weil die genau einen index hinterherhängt.
Ich würde das ganze gerne über Linq Lösen. Habe jedoch im moment noch keinen Ansatz, da ich mit linq noch recht neu bin.
Hier mein bisheriger Code.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50:
| IHTMLElement2 ie = (IHTMLElement2)oHtmlDoc.body; IHTMLElementCollection iec = (IHTMLElementCollection)ie.getElementsByTagName("td"); IHTMLElement pastitem=null; int indexhelper = 0; int controlhelper = 0; bool runonce2 = true; foreach (IHTMLElement item in iec) { if ((item.innerText == null && indexhelper == 0)) { dataHolder.Rows.Add(dataHolder.NewRow()); indexhelper++; } if (item.className == "statusEven" || item.className == "statusOdd" || item.className == "statusOK" || item.className == "status" ) { if ((item.className == "statusEven" || item.className == "statusOdd" || item.className == "status") && item.innerHTML.Contains("<IMG")) { } else { if ((item.innerText == null && indexhelper == 0)) { dataHolder.Rows.Add(dataHolder.NewRow()); indexhelper++; } if (!(item.innerHTML.Contains("<IMG"))) { if (item.innerText != null) { dr = dataHolder.NewRow(); dr[0] = item.innerText; dataHolder.Rows.Add(dr); indexhelper++; } } } pastitem = item; } if (indexhelper >= 7) { indexhelper = 0; controlhelper++; } if (runonce2 == true && dataHolder.Rows.Count >=1) { dataHolder.Rows.RemoveAt(0); runonce2 = false; } } |
nichtwundern, controlhelper variablen etc.. sind noch zu testzwecken drin, ich wollte da mal was ausstesten.
Moderiert von Th69: Beitragsformatierung (C#-Code) überarbeitet.
danke th69
war noch am zusammenstellen.
Ich würde ja in etwa die linq abfrage so schreiben wollen, was aber nicht korrekt ist.
C#-Quelltext
1: 2: 3:
| IHTMLElement query = from element in iec where element.item.sourceIndex = item.sourceIndex+1 select element.item |