Html agility pack / xpath sélectionner le noeud enfant à l'aide de [index] help, please

c#-4.0 html-agility-pack xpath

Question

Je travaille depuis un certain temps avec un nœud défini dans le pack d'agilité C # / html et, après essais et erreurs, j'ai une liste de nœuds sur lesquels je souhaite effectuer une boucle, obtenant les nœuds enfants de chacun des nœuds de la boucle. Je voudrais faire référence à eux par index # (semble être le plus facile, mais ici je poste). J'ai essayé différentes manières de formater le xpath, y compris "[0]", "/ [0]", "tr / [0]", etc. Voici ce que j'ai jusqu'à présent, tout fonctionne correctement jusqu'au premier commentaire ligne:

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;
                }

Réponse acceptée

Vous avez traversé jusqu'au nœud tr . Maintenant, vous devriez accéder au noeud td . Vous pouvez donc utiliser le XPATH comme ci-dessous.

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

Le premier noeud td est également accédé en tant que td[1] et non pas td[0] .

Comme Alex l'a souligné, vous pouvez écrire quelque chose comme ci-dessous, qui est une excellente suggestion.

node.ChildNodes[0].InnerText

HTH



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow