2010-07-10 2 views
4

HTMLAgilityPack을 사용하여 각 행에 특정 셀을 가져 오려고합니다.모든 HTML 테이블 행의 첫 번째 및 두 번째 셀 가져 오기

foreach (HtmlNode row in ContentNode.SelectNodes("descendant::tr")) 
{ 
    //Do something to first cell 
    //Do something to second cell 
} 

세포가 더 많으며 각 세포에는 특별한 치료가 필요합니다. XPath를 사용하여이 작업을 수행하는 방법이 있지만 실제로는 쓸모가 없습니다. 즉

// from row 
var firstCell = row.SelectSingleNode("td[1]"); 

// each first cell in a table (note: tbody is not always there) 
var allFirstCells = table.SelectNodes("tbody/tr/td[1]"); 

, 사용 대괄호 셀 번호 : 다음 행의 자식 각각의 첫 번째 셀을 얻으려면, 당신이 할 수있는

var cell1 = row.SelectSingleNode("descendant::td:first"); 
+0

좋은 질문 (+1). 원하는 노드를 정확히 선택하는 한 줄짜리 XPath 식에 대한 답을보십시오. –

답변

2

같은 아마 뭔가가 있나요 당신은 선택하기를 원합니다.

// from row 
var firstCell = row.SelectSingleNode("td[1]"); 
var siblingCell = firstCell.SelectSingleNode("./following-sibling::td"); 

: 당신이 현재 셀 옆에있는 셀을 얻고 싶은 경우에, 당신은 같은 것을 할 수

// from row 
var lastCell = row.SelectSingleNode("td[last()]"); 

// each last cell in a table 
var allLastCells = table.SelectNodes("tbody/tr/td[last()]"); 

: 예외는 다음과 같이 last()를 사용하여 얻을 수있는 마지막 셀입니다 오타가 있거나로드 한 DOM 트리에 요청한 셀이 포함되어 있지 않음을 의미하는 null의 반환 값을 확인할 수 있습니다.

+0

달콤한! 그것은 단지 "정규"XPath인가, 아니면 htmlagilitypack-dudes의 특별한 조합입니까? – peirix

+0

@peirix : 완전히 규칙적인 XPath입니다. HtmlAgility는 특별한 것을 추가하지 않습니다. 그들은 .NET DOM을 만들고 SelectNodes는 XPath 1.0의 Microsoft .NET 구현을 사용합니다. – Abel

2

대신 :

descendant::tr 

사용 :

descendant::tr/td[not(position() >2)] 
+1

+1, 멋진 & 빠른 해결책. 그러나 "각 셀은 특별한 처리가 필요합니다"* (OQ) 비즈니스 로직은 'mod 2'또는 이와 비슷한 것이 필요하며 각 행에 1 개 이상의 셀이 들어 있지 않은 경우 문제가됩니다. – Abel

관련 문제