2013-03-16 34 views
5

Próbuję wybrać tekst wewnętrzny td z atrybutem id z HTMLAgilityPack.HTMLAgilityPack uzyskać innerText tagu td z atrybutem id

kod HTML:

<td id="header1"> 5 </td> 
<td id="header2"> 8:39pm </td> 
<td id="header3"> 8:58pm </td> 
... 

Kod:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 

doc.LoadHtml(data); 

var nodes = doc.DocumentNode.SelectNodes("//td[@id='header1']"); 

if (nodes != null) 
{ 
    foreach (HtmlAgilityPack.HtmlNode node in nodes) 
    { 
     MessageBox.Show(node.InnerText); 
    } 
} 

Wciąż dostaję pustych węzłów ponieważ nie jestem wybierając prawidłowo znacznika td ale nie może dowiedzieć się, co zrobiłem źle ...

Edytuj:

Popełniłem błąd z nagłówkiem1 i nagłówkiem2, ale jest 5 d różne znaczniki td z nagłówkami od 1 do 5.

+1

Czy sprawdzić te identyfikatory ty ha ve wzięty. '' i pobierasz z ** '(// td [@ id = 'header1'"); '** –

+1

W html id to' header2' w kodzie, to jest określony jako 'header1'. –

+0

Twój kod wydaje się być poprawny. Czy możesz gdzieś umieścić swoje dane? –

Odpowiedz

6

Próbujesz wybrać header1, ale identyfikator to header2.

Można również użyć GetElementById bezpośrednio:

var td = doc.GetElementbyId("header2"); 
1

Hmm .. Nie sądzę, że robisz coś złego. Twój kod powinien dać ci tylko <td> z id="header1". Jeśli, powiedzmy, od header1 do header5 można zrobić:

for (int i = 1; i <= 5; i++) { 
    var tdNode = doc.DocumentNode.SelectSingleNode(string.Format("//td[@id='header{0}']", i)); 

    //do something with the node here 
} 

chociaż proponuję opublikowania swojej cały kod, tak, że możemy powiedzieć, dlaczego jesteś coraz null, a także lepszy sposób .. od analizowania <td> węzły bez robienia powyższej pętli (np coś //tr[@id='some-id']//td[contains(@id, 'header')]

0

można rozwiązać problemu za pomocą innerHTML nieruchomości jak:

var td = doc.GetElementbyId("header2").InnerHtml;