2012-04-05 4 views
1

Ich habe eine Weile mit einem Knoten in C#/HTML Agility Pack arbeiten gearbeitet, und durch Versuch und Irrtum habe ich eine Liste von Knoten, die ich überschleifen möchte, die untergeordneten Knoten jedes der Knoten aus der Schleife. Ich würde gerne auf sie nach Index # verweisen (scheint am einfachsten zu sein, aber hier poste ich). Ich habe verschiedene Wege ausprobiert, um den XPath zu formatieren, darunter "[0]", "/ [0]", "tr/[0]" usw. Hier ist was ich bisher gemacht habe, alles funktioniert bis zum ersten Kommentar Leitung:Html Agility Pack/XPath wählen Kind Knoten von [Index] Hilfe, bitte?

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

Warum Sie nicht verwenden 'ChildNodes' Eigenschaft auf Kinderknoten zugreifen? – Alex

+0

@Alex Das war genau das, was ich gesucht habe, danke auch. – StatsViaCsh

Antwort

4

Sie haben bis tr Knoten durchlaufen. Jetzt sollten Sie auf td Knoten zugreifen. So können Sie die XPATH wie unten verwenden.

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

Auch die ersten td Knoten werden als td[1] und nicht td[0] abgerufen.

Wie Alex darauf hingewiesen, können Sie etwas wie unten schreiben, was ein ausgezeichneter Vorschlag ist.

node.ChildNodes[0].InnerText 

HTH

+0

Vielen Dank, das hat den Trick gemacht .. – StatsViaCsh