2017-04-12 1 views
-1
WebClient client = new WebClient(); 
var data = client.DownloadString("a web link"); 

で「ネストした表」と私はメインテーブルの各行の別のテーブルを意味し、こののC# - HTMLクラス

<table> 
<tr> 
    <td> Team 1 ID </td> 
    <td> Team 1 Name </td> 
    <td> 
     <table> 
     <tr> 
      <td> Member 1 name </td> 
      <td> Member 1 age </td> 
     </tr> 
     <tr> 
      <td> Member 2 name </td> 
      <td> Member 2 age </td> 
     </tr> 
     </table> 
    </td> 
</tr> 
<tr> 
    <td> Team 2 ID </td> 
    <td> Team 2 Name </td> 
    <td> 
     <table> 
     <tr> 
      <td> Member 1 name </td> 
      <td> Member 1 age </td> 
     </tr> 
     </table> 
    </td> 
</tr> 

のような表がありますするHTMLページを取得していますだから私はそれをネストしたテーブルと呼んだ。今私は、各チームはので、私は私の問題を解決することができ、サウンドソリューションを求めている0~3員

を持っているかもしれない、というノートこの

class Team 
{ 

    public int teamID; 
    public string teamName; 
    public struct Member 
    { 
     public string memberName; 
     public int memberAge; 
    } 

    public Member member1; 
    public Member member2; 
} 

のようにクラスにこれらのデータを取得したいものは何でも、 。 RegExまたはHtmlAgilityPackを使用する必要がありますか、どちらの方法が適切ですか? ありがとうございました

答えて

0

ただHtmlAgilityPackを使用してください。あなたがトラブルに遭遇した場合、私はあなたを助けることができます。

正規表現は通常の言語にしか一致しませんが、HTMLは 文脈自由言語です。 HTML のregexpsで行うことができるのはヒューリスティックですが、それはすべての条件では機能しません。 正規表現によって誤って一致するHTMLファイルを表示するには、 が可能である必要があります。

Using regular expressions to parse HTML: why not?

あなたのHTMLは任意の識別子(CSSクラスまたはID)が含まれている場合には容易になります

更新コード:ここにあなたの問題

 string mainURL = "your url"; 
     HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb(); 
     HtmlAgilityPack.HtmlDocument doc = web.Load(mainURL); 

     var tables = doc.DocumentNode.Descendants("table").Where(_ => _.Descendants("table").Any());//this will give you all tables which contain another table inside 
     foreach (var table in tables) 
     { 
      var rows = table.ChildNodes.Where(_ => _.Name.Equals("tr"));//get all tr children (not grand children) 
      foreach (var row in rows) 
      { 
       for (int i = 0; i < row.ChildNodes.Count; i++) 
       { 
        if (row.ChildNodes[i].Name.Equals("td")) 
        { 
         //you can put your logic here, for eg i == 0, assign it to TeamID properties etc... 
        } 
        if (row.ChildNodes[i].Name.Equals("table")) 
        { 
         //here is your logic to handle nested table 
        } 
       } 
      } 
     } 
+0

各テーブルにアプローチする私の提案です同じクラスを持つので、別々に識別することはできません。 いいえ私は試していますが、この問題のコード解決策を教えてくれれば嬉しいです。 –

+0

はちょうど私が右方向 –

+0

< "表table-凝縮テーブル-囲ま" テーブルクラス=> ​​クラスID ​​ステータス ​​時間にあなたを指すことができ、利用可能なすべての属性を使ってHTMLを提供 ​​00001 ​​オープン ​​ \t <テーブルクラス= "テーブルのテーブル縮合テーブルボーダー"> \t \t \t \t \t​​8:00 \t \t \t​​9:30 \t \t \t \t \t \t \t​​8:0 0 AM \t \t \t​​9:30 \t \t \t –