나는 다음과 같은 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>
(..)
내가 가지고있는 정보는 => "Test1"& "Test2"라는 이름입니다. 내가 알고 싶은 것은 내가 가지고있는 이름을 기반으로 "데이터"와 "데이터 2"에있는 데이터를 어떻게 얻을 수 있는가입니다.
현재 사용하고있는 것은 :
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;
하지만 {"Object reference not set to an instance of an object."}
data
를 살펴볼 때
시도에 관해서는 코드에 두 가지 문제가 있습니다.
ChildNodes
는 이상하다. class
속성을 가지고 있지 않은 공백 텍스트 노드를 반환한다. (당연히 속성을 가질 수 없다.) 이 두 가지 수정 사항을 통해 다음과 같은 작업을 수행 할 수 있습니다.
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;
여기 XPATH 방식입니다 - 음 ... 모든 사람들이 XPATH의 힘을 잊어 버렸고 독점적으로 C # XLinq에 집중하고있는 것 같습니다 :-)
이 함수는 이름과 관련된 모든 데이터 값을 가져옵니다.
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();
}
예를 들어,이 코드는 모든 'Test2'데이터를 덤프합니다.
HtmlDocument doc = new HtmlDocument();
doc.Load(yourHtml);
foreach (string data in GetData(doc, "Test2"))
{
Console.WriteLine(data);
}