어떻게 html로 테이블에있는 행을 계산하는 C #

c# html-agility-pack html-parsing linq

문제

html 파일 내에 복합 테이블이있을 때 어떻게 부모 테이블의 행을 계산할 수 있습니다.

복합 표가 의미하는 바는 무엇입니까? 테이블의 일부 셀에 다른 테이블이 들어있는 테이블.

다음은 코딩에 대한 나의 시도입니다. 참고 잘못된 값이 나타납니다.

        String htmlFile = "C:/Temp/Test_13.html";
        HtmlDocument doc = new HtmlDocument();
        doc.Load(htmlFile);

        HtmlNodeCollection tables = doc.DocumentNode.SelectNodes("//table");
        HtmlNodeCollection rows = tables[1].SelectNodes(".//tr");
        Console.WriteLine(" Rows in second (Parent) table: " + rows.Count());

귀하의 답에 어떤 네임 스페이스가 사용되는지 표시하십시오.

대표적인 샘플 파일은 다음과 같습니다.

<html>
<body>
<table border="1">
<tr>
<td>Apps</td>
</tr>
<tr>
<td>Offcie Web Apps</td>
</tr>
</table>
<br/>
<table border="1">
<tr>
<td>Application</td>
<td>Status</td>
<td>Instances</td>
</tr>
<tr>
<td>PowerPoint</td>
<td>Online</td>
<td>
    <table border="1">
    <tr>
        <td>Server1</td>
        <td>Online</td>
    </tr>
    <tr>
        <td>Server2</td>
        <td>Disabled</td>
    </tr>
    </table>
</td>
</tr>
<tr>
<td>Word</td>
<td>Online</td>
<td>
    <table border="1">
    <tr>
        <td>Server1</td>
        <td>Online</td>
    </tr>
    <tr>
        <td>Server2</td>
        <td>Disabled</td>
    </tr>
    </table>
</td>
</tr>
</table>
</body>
</html>

고맙습니다.

수락 된 답변

내가 올바르게 이해한다면 이것은 당신이 원하는 것입니다.

int i = 1;
HtmlNodeCollection tables = doc.DocumentNode.SelectNodes("//table");
foreach (HtmlNode table in tables)
{
    var tmp = table.ParentNode;
    if (tmp.OriginalName.Contains("td"))
        MessageBox.Show("The parent of table #" + i + " has" + tmp.ParentNode.ParentNode.Elements("tr").Count().ToString() + " rows.");
    i++;
}

MessageBox가 2 번 나타납니다.

"The parent of table #3 has 3 rows."
"The parent of table #4 has 3 rows."

수정 (질문에 대한 답변) :

1) int i = 1 에서 카운터를 시작했습니다. var i = 1 은 똑같은 것이고, 자동적으로 varint 대체합니다.

2) 코드 편집을 마치면 나에게도 같은 결과가 나타납니다.

3) 테이블 1, 테이블 2, 테이블 3, 테이블 4가 있으므로 1부터 계산을 시작했습니다. 귀하의 2 마지막 테이블 (테이블 # 3 및 # 4) 테이블 # 2의 하위 테이블, 테이블 # 2 3 행이 있습니다. 위의 코드는 일부 테이블의 하위 테이블 인 테이블 만 인쇄합니다. 당신이 원하는 것을 대답으로 보여줄 수 있습니까?

편집 2 :

int i = 1;
HtmlNodeCollection tables = doc.DocumentNode.SelectNodes("//table");
foreach (HtmlNode table in tables)
{
    if (!table.ParentNode.OriginalName.Contains("td")) // If table is not sub-table
        MessageBox.Show("Table #" + i + " have " + table.Elements("tr").Count().ToString() + " rows.");
    i++;
}

MessageBox가 2 번 나타납니다.

"The parent of table #1 has 2 rows."
"The parent of table #2 has 3 rows."

인기 답변

csQuery nuget 패키지를 사용해 보는 것이 좋습니다. 그것은 그런 일을하는 것에서 대부분의 두통을 없애기 위해 고안되었습니다. CSS 선택기 쿼리 구문을 사용할 수 있습니다.이 구문은 대부분의 웹 개발자가 잘 알고 있습니다. 이 경우 body > table:nth-of-type(2) > tr 빠져 나와서 모든 tr의 배열을 반환 한 다음 계산하거나 결과 배열의 길이를 확인할 수 있습니다. 또는 body > table ~ table > trbr + table > tr 과 같이 제공 한 샘플에서도 사용할 수 있습니다.



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