2012-05-22 71 views
3

這是我的示例頁面。我想將標籤的所有內部文本都放到一個字符串中。我寫的代碼,這個,但它不能正常工作如何獲得多個<a>標記的內聯網?

<body> 
    <div id="infor"> 
     <div id="genres"> 
      <a href="#" >Animation</a> 
      <a href="#" >Short</a> 
      <a href="#" >Action</a> 
     </div> 
    </div> 
</body> 

我想要得到的所有標籤內的文字,將一個字符串,我用這個代碼,要做到這一點,但它不能正常工作。

class Values 
{ 
    private HtmlAgilityPack.HtmlDocument _markup; 

    HtmlWeb web = new HtmlWeb(); //creating object of HtmlWeb 
    form1 frm = new form1; 

    _markup = web.Load("mypage.html"); // load page 

    public string Genres 
    { 
     get 
     { 
      HtmlNodeCollection headers = _markup.DocumentNode.SelectNodes("//div[contains(@id, 'infor')]/a"); // I filter all of <a> tags in <div id="infor"> 
      if (headers != null) 
      { 
       string genres = ""; 
       foreach (HtmlNode header in headers) // I'm not sure what happens here. 
       { 
        HtmlNode genre = header.ParentNode.SelectSingleNode(".//a[contains(@href, '#')]"); //I think an error occurred in here... 
        if (genre != null) 
        { 
         genres += genre.InnerText + ", "; 
        } 
       } 
       return genres; 
      } 
      return String.Empty; 
     } 
    } 

    frm.text1.text=Genres; 
} 

的text1(返回值)是:

Animation, Animation, Animation, 

但我想這樣的輸出:

Animation, Short, Action, 
+0

是'header'而不是你實際上想要獲得'InnerText'的節點?這個流派選擇代碼看起來像是說每次都得到第一個兄弟姐妹,這個兄弟姐妹顯然是一樣的......你想用這些代碼做什麼? – Chris

回答

1

小LINQ和使用後代將讓你有更簡單,我想。

var genreNode = _markup.DocumentNode.Descendants("div").Where(n => n.Id.Equals("genre")).FirstOrDefault(); 
if (genreNode != null) 
{ 
    // this pulls all <a> nodes under the genre div and pops their inner text into an array 
    // then joins that array using the ", " as separator. 
    return string.Join(", ", genreNode.Descendants("a") 
     .Where(n => n.GetAttributeValue("href", string.Empty).Equals("#")) 
     .Select(n => n.InnerText).ToArray()); 
} 
1

它看起來像你的問題是header.ParentNode.SelectSingleNode(".//a[contains(@href, '#')]")聲明。它會帶您回到父元素div,然後找到與條件匹配的第一個a元素(始終是相同的元素)。你已經有了a節點,所以你可以通過它的屬性檢查它的屬性,而不是做另一個選擇。然而,這是愚蠢做第二次選擇時,你可以只是做一個選擇範圍縮小在首位,如:

HtmlNodeCollection headers = _markup.DocumentNode.SelectNodes("//div[contains(@id, 'infor')]/a[contains(@href, '#')]"); 
if (headers != null) 
    { 
    string genres = ""; 
    foreach (HtmlNode header in headers) // i not sure what happens here. 
     { 
     genres += header.InnerText + ", "; 
     } 
    return genres; 
    }