Ich habe folgendes HTML
(..)
<tbody>
<tr>
<td class="name"> Test1 </td>
<td class="data"> Data </td>
<td class="data2"> Data 2 </td>
</tr>
<tr>
<td class="name"> Test2 </td>
<td class="data"> Data2 </td>
<td class="data2"> Data 2 </td>
</tr>
</tbody>
(..)
Die Information die ich habe ist der Name => also "Test1" & "Test2". Was ich wissen möchte ist, wie kann ich die Daten bekommen, die in "Daten" und "Daten2" basierend auf dem Namen ich habe.
Zur Zeit verwende ich:
var data =
from
tr in doc.DocumentNode.Descendants("tr")
from
td in tr.ChildNodes.Where(x => x.Attributes["class"].Value == "name")
where
td.InnerText == "Test1"
select tr;
Aber ich bekomme {"Object reference not set to an instance of an object."}
Wenn ich versuche, in data
zu suchen
Was deinen Versuch angeht, hast du zwei Probleme mit deinem Code:
ChildNodes
ist seltsam - es gibt auch Leerzeichen- ChildNodes
zurück, die keine class
haben (natürlich keine Attribute). Mit diesen zwei Korrekturen funktioniert das Folgende:
var data =
from tr in doc.DocumentNode.Descendants("tr")
from td in tr.Descendants("td").Where(x => x.Attributes["class"].Value == "name")
where td.InnerText.Trim() == "Test1"
select tr;
Hier ist der XPATH Weg - hmmm ... alle scheinen die Power XPATH vergessen zu haben und konzentrieren sich ausschließlich auf C # XLinq, diese Tage :-)
Diese Funktion ruft alle Datenwerte ab, die mit einem Namen verknüpft sind:
public static IEnumerable<string> GetData(HtmlDocument document, string name)
{
return from HtmlNode node in
document.DocumentNode.SelectNodes("//td[@class='name' and contains(text(), '" + name + "')]/following-sibling::td")
select node.InnerText.Trim();
}
Zum Beispiel wird dieser Code alle 'Test2'-Daten ausgeben:
HtmlDocument doc = new HtmlDocument();
doc.Load(yourHtml);
foreach (string data in GetData(doc, "Test2"))
{
Console.WriteLine(data);
}