테이블을 데이터 테이블 또는 배열로 htmlAgilityPack 구문 분석

c# html-agility-pack linq

문제

나는이 테이블을 가지고있다.

<table>
<tbody>
<tr><th>Header 1</th></tr>
</tbody>
</table>

<table>
<tbody>
<tr>
<th>Header 1</th>
<th>Header 2</th>
<th>Header 3</th>
<th>Header 4</th>
<th>Header 5</th>
</tr>
<tr>
<td>text 1</td>
<td>text 2</td>
<td>text 3</td>
<td>text 4</td>
<td>text 5</td>
</tr>
</tbody>
</table>

이 코드를 사용하여 배열 또는 List로 변환하려고합니다 :

<table>
<tbody>
<tr><th>Header 1</th></tr>
</tbody>
</table>

<table>
<tbody>
<tr>
<th>Header 1</th>
<th>Header 2</th>
<th>Header 3</th>
<th>Header 4</th>
<th>Header 5</th>
</tr>
<tr>
<td>text 1</td>
<td>text 2</td>
<td>text 3</td>
<td>text 4</td>
<td>text 5</td>
</tr>
</tbody>
</table>

그러나 그것은 효과가 없습니다. 뭐가 잘못 되었 니?

수락 된 답변

몇 가지 메모 :

  • 너는 캐스트가 필요 없어.
  • 각 행에 헤더가 있다고 가정합니다.
  • SelectNodes는 xpath를 받아야하며 이름 만 전달합니다.

내가 당신이라면 foreach를 사용하여 데이터를 모델링 할 수 있습니다. 더 많은 제어와 효율성을 얻게됩니다. 그러나 여전히 당신이 원하는 방식대로 수행하고 싶다면 어떻게해야할까요?

var query = from table in doc.DocumentNode.SelectNodes("//table")
                        where table.Descendants("tr").Count() > 1 //make sure there are rows other than header row
                        from row in table.SelectNodes((".//tr[position()>1]")) //skip the header row
                        from cell in row.SelectNodes(("./td")) 
                        from header in table.SelectNodes(".//tr[1]/th") //select the header row cells which is the first tr
                        select new
                        {
                            Table = table.Id,
                            Row = row.InnerText,
                            Header = header.InnerText,
                            CellText = cell.InnerText
                        };



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.