2016-05-13 4 views
0

Below Parsing ist meine HTML-Struktur (Tabelle):eine HTML-Struktur

<table> 
    <tr><td>A</td></tr> 
</table> 
<table> 
    <tr><td>B</td></tr> 
</table> 
<table> 
    <table> 
     <table> 
      <table> 
       <tbody> 
        <tr class="A"> 
         <td> 
          ABC 
         </td> 
         <td> 
          <a href="abc.com">Link</a> 
         </td> 
        </tr> 
        <tr class="B"> 
         <td> 
          DEF 
         </td> 
         <td> 
          <a href="abcd.com">Link2</a> 
         </td> 
        </tr> 
       </tbody> 
      </table> 
     </table> 
    </table> 
</table> 

Ich habe versucht, Daten zu erhalten, wie unten:

HtmlNode thediv = doc.DocumentNode.SelectSingleNode("//table[3]//table[1]"); 

⇒ Es funktioniert gut.

Aber habe ich versucht, mit Code wie unten Daten ABC/DEF in der Tabelle zu erhalten 3.

HtmlNode thediv = doc.DocumentNode.SelectSingleNode(
         "//table[3]//table[1]//table[2]//table[3]"); 

⇒ Nicht OK.

Antwort

0

denke ich, was Sie wirklich wollen, ist

var bothNodes = doc.DocumentNode.SelectNodes("//table[3]//table[1]//tr/td[1]/text()"); 

, dass Sie geben beide Knoten ABC und DEF der dritten Tabelle

Sie können es hier versuchen: XPathFiddle

Ihr Code doesn‘ t funktionieren, weil es keinen Knoten gibt, der zur zweiten Abfrage passt. Schritt für Schritt:

Das ist Ihre ursprüngliche html:

<table> 
    <tr><td>A</td></tr> 
</table> 
<table> 
    <tr><td>B</td></tr> 
</table> 
<table> 
    <table> 
     <table> 
      <table> 
       <tbody> 
        <tr class="A"> 
         <td> 
          ABC 
         </td> 
         <td> 
          <a href="abc.com">Link</a> 
         </td> 
        </tr> 
        <tr class="B"> 
         <td> 
          DEF 
         </td> 
         <td> 
          <a href="abcd.com">Link2</a> 
         </td> 
        </tr> 
       </tbody> 
      </table> 
     </table> 
    </table> 
</table> 

//table[3] gibt Ihnen die dritte Tabelle

<table> 
    <table> 
     <table> 
      <table> 
       <tbody> 
        <tr class="A"> 
         <td> 
          ABC 
         </td> 
         <td> 
          <a href="abc.com">Link</a> 
         </td> 
        </tr> 
        <tr class="B"> 
         <td> 
          DEF 
         </td> 
         <td> 
          <a href="abcd.com">Link2</a> 
         </td> 
        </tr> 
       </tbody> 
      </table> 
     </table> 
    </table> 
</table> 

//table[3]//table[1] Sie die erste Tabelle gibt, die ein Nachkomme der dritten Tabelle ist.

<table> 
    <table> 
     <table> 
      <tbody> 
       <tr class="A"> 
        <td> 
         ABC 
        </td> 
        <td> 
         <a href="abc.com">Link</a> 
        </td> 
       </tr> 
       <tr class="B"> 
        <td> 
         DEF 
        </td> 
        <td> 
         <a href="abcd.com">Link2</a> 
        </td> 
       </tr> 
      </tbody> 
     </table> 
    </table> 
</table> 

//table[3]//table[1]//table[2] würden Sie die zweite Tabelle geben, die ein Nachkomme ist die erste Tabelle, die ein Nachkomme der dritten Tabelle ist. Und es gibt nur einen -> funktioniert nicht.

+0

Hallo Manfred Radlwimmer, Vielen Dank für Ihre Antwort. Ich habe es gemacht :). – tranphu0ng

0

Hallo Manfred Radlwimmer,

Vielen Dank für Ihre Antwort. Ich habe es gemacht :).

Der Code ist unten:

if (doc.DocumentNode.SelectNodes("//table") != null) 
      { 
       HtmlNode thediv = doc.DocumentNode.SelectSingleNode("//table[3]//table[1]//tr/td[1]//tr[3]//table//tr/td[2]//table"); 
       HtmlNodeCollection cells = thediv.SelectNodes("tr"); 
       for (var j = 1; j < cells.Count; ++j) 
       { 
        var data= cells[j].InnerText; 
       } 
      } 
Verwandte Themen