2010-07-10 5 views
4

J'essaie d'obtenir seulement des cellules spécifiques dans chaque ligne en utilisant HTMLAgilityPack.Récupère les première et deuxième cellules de chaque ligne du tableau HTML

foreach (HtmlNode row in ContentNode.SelectNodes("descendant::tr")) 
{ 
    //Do something to first cell 
    //Do something to second cell 
} 

Il y a plus de cellules, et chaque cellule nécessite un traitement spécialisé. Je suppose qu'il y a un moyen de le faire en utilisant XPath, mais je suis assez inutile à cela. Y at-il peut-être quelque chose comme

var cell1 = row.SelectSingleNode("descendant::td:first"); 
+0

Bonne question (1). Voir ma réponse pour une expression XPath à une seule ligne qui sélectionne exactement les nœuds désirés. –

Répondre

2

Pour chaque première cellule qui est un enfant d'une ligne, vous pouvez effectuer les opérations suivantes:

// from row 
var firstCell = row.SelectSingleNode("td[1]"); 

// each first cell in a table (note: tbody is not always there) 
var allFirstCells = table.SelectNodes("tbody/tr/td[1]"); 

En d'autres termes, utiliser des crochets et le nombre de cellules vous souhaitez sélectionner. Une exception est la dernière cellule, que vous pouvez obtenir en utilisant last() comme suit:

// from row 
var lastCell = row.SelectSingleNode("td[last()]"); 

// each last cell in a table 
var allLastCells = table.SelectNodes("tbody/tr/td[last()]"); 

Si vous voulez obtenir la cellule à côté d'une cellule courante, vous pouvez faire quelque chose comme ceci:

// from row 
var firstCell = row.SelectSingleNode("td[1]"); 
var siblingCell = firstCell.SelectSingleNode("./following-sibling::td"); 

Vous pouvez vérifier les valeurs de retour pour null, ce qui signifie que vous avez une faute de frappe, ou l'arbre DOM que vous avez chargé ne contient pas la cellule que vous avez demandé.

+0

Doux! Est-ce juste XPath "régulier", ou est-ce une concoction spéciale du htmlagilitypack-dudes? – peirix

+0

@peirix: c'est un XPath totalement régulier. HtmlAgility n'ajoute rien de spécial. Ils créent un DOM .NET et SelectNodes utilise l'implémentation Microsoft .NET de XPath 1.0. – Abel

2

Au lieu de:

descendant::tr 

utilisation:

descendant::tr/td[not(position() >2)] 
+1

+1, solution agréable et rapide. Mais pour * "chaque cellule a besoin d'un traitement spécial" * (OQ), la logique métier aura besoin d'un "mod 2" ou similaire et cela devient problématique dans les cas où chaque ligne ne contient pas plus de 1 cellule. – Abel