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

,我得到一個HTML頁面,其中有這樣的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> 

表,這意味着另一個表主表中的每一行中所以我把它叫做嵌套表。 什麼的,現在我想這些數據進入類像這樣的,每隊可以有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; 
} 

音符。 我應該使用正則表達式還是HtmlAgilityPack,或者哪種方式適用? 在此先感謝

回答

0

只需使用HtmlAgilityPack。如果遇到麻煩,我可以幫助你。

正則表達式只能匹配常規語言,但HTML是 上下文無關語言。使用HTML 上的正則表達式可以做的唯一的事情是啓發式,但不適用於任何情況。它應該是 可能呈現一個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

只需提供您的HTML所有可用的屬性,我可以爲您指出正確的方向 –

+0

<表類= 「table表冷凝表鑲上」> ​​類ID ​​狀態 ​​時間 ​​00001 ​​打開 ​​ \t <表類= 「表表冷凝表鑲上」> \t \t \t \t \t​​上午08時00分 \t \t \t​​上午09時30分 \t \t \t \t \t \t \t​​8:0上午12時 \t \t \t​​9:30 AM \t \t \t –