2012-04-05 91 views
1

我一直工作了一段時間,在C#/ html敏捷包中設置了一個節點,並通過試驗和錯誤我有一個我想要循環的節點列表,從每個節點中獲取每個節點的子節點循環。我想通過索引號來引用它們(似乎是最簡單的,但我在這裏發佈)。我已經嘗試了不同的方式來格式化xpath,包括「[0]」,「/ [0]」,「tr/[0]」等等。以下是我迄今爲止所做的一切工作正常,行:Html敏捷包/ xpath請用[index]幫助選擇子節點?

protected override List<IDataPoint> ReturnDataPointsFromIndividualAddressString(string AddressString) 
      { 
       List<IDataPoint> earningsAnnouncements = new List<IDataPoint>(); 

       HtmlWeb hwObject = new HtmlWeb(); 
       HtmlDocument htmlDoc = hwObject.Load(AddressString); 

       if (htmlDoc.DocumentNode != null) 
       { 
        List<HtmlNode> nodeList = new List<HtmlNode>(); 

        var nodes = htmlDoc.DocumentNode.SelectNodes("html[1]/body[1]/table[4]/tr[1]/td[1]/table[1]/tr"); 

        if (nodes != null) 
        { 
         foreach (HtmlNode n in nodes) 
         { 
          if (n.OuterHtml.Contains("finance.yahoo.com")) 
            nodeList.Add(n); 
         } 
        } 

        foreach (HtmlNode node in nodeList) 
        { 
         EarningsAnnouncementDP earningsAnnouncement = new EarningsAnnouncementDP(); 

         //Error: Expression must evaluate to a node set. 
         earningsAnnouncement.Company = (node.SelectSingleNode("[0]")).InnerText.ToString(); 
         earningsAnnouncement.Ticker = node.SelectSingleNode("[1]").InnerText.ToString(); 
         earningsAnnouncement.Estimate = node.SelectSingleNode("[2]").InnerText.ToString(); 
         earningsAnnouncement.AnnouncementTime = node.SelectSingleNode("[3]").InnerText.ToString(); 

         earningsAnnouncements.Add(earningsAnnouncement); 
        } 

        return earningsAnnouncements; 
       } 
+1

你爲什麼不使用'ChildNodes'屬性來訪問子節點? – Alex 2012-04-06 06:02:18

+0

@Alex這正是我一直在尋找的,謝謝你。 – StatsViaCsh 2012-04-06 21:24:56

回答

4

您已遍歷,直到tr節點。現在您應該訪問td節點。所以你可以使用下面的XPATH

node.SelectSingleNode("./td[1]").InnerText; 
node.SelectSingleNode("td[1]").InnerText; 

另外,在第一td節點被作爲td[1]和不td[0]訪問。

正如亞歷克斯指出的,你可以寫下如下這是一個很好的建議。

node.ChildNodes[0].InnerText 

HTH

+0

非常感謝,那就是訣竅。 – StatsViaCsh 2012-04-06 21:24:33