0

J'ai plusieurs tables et la valeur Location est donnée dans un ordre d'index différent. Comment puis-je obtenir la valeur de l'emplacement si la chaîne de cellule précédente est "Location" lorsque je parcours la table. Sur l'exemple ci-dessous ce sont les cellules [7] mais sur l'autre table ce sera 9. Comment puis-je obtenir des valeurs conditionnellement après que le texte interne des cellules soit "Emplacement"? Fondamentalement trouver la cellule "Location" obtenir le texte interne de la cellule suivante.Html Agility Pack Loop Through Table - Récupère la valeur de la cellule en fonction de la valeur de la cellule précédente

Html Tableau:

<table class="tbfix FieldsTable""> 
<tbody> 
    <tr> 
     <td class="name">Last Movement</td> 
     <td class="value">Port Exit</td> 
    </tr> 
    <tr> 
     <td class="name">Date</td> 
     <td class="value">26/06/2017 00:00:00</td> 
    </tr> 
    <tr> 
     <td class="name">From</td> 
     <td class="value">HAMBURGE</td> 
    </tr> 
    <tr> 
     <td class="name">Location</td> 
     <td class="value">EUROGATE HAMBURG</td> 
    </tr> 
    <tr> 
     <td class="name">E/F</td> 
     <td class="value">E</td> 
    </tr> 
</tbody> 

Controller Loop Through:

foreach (var eachNode in driver.FindElements(By.XPath("//table[contains(descendant::*, 'Last Movement')]"))) 
       { 
        var cells = eachNode.FindElements(By.XPath(".//td")); 
        cd = new Detail(); 

        for (int i = 0; i < cells.Count(); i++) 
        { 
         cd.ActionType = cells[1].Text.Trim(); 
         string s = cells[3].Text.Trim(); 
         DateTime dt = Convert.ToDateTime(s); 
         if (_minDate > dt) _minDate = dt; 
         cd.ActionDate = dt; 

        } 
       } 

Répondre

1

Dans votre boucle foreach vous pouvez utiliser ceci:

var location = eachNode.FindElement(By.XPath(".//td[contains(text(),'Location')]/following-sibling::td)); 
1

En supposant que vos données sont toujours structuré comme ça je boucle sur toutes les balises et ajoute les données à un dictionnaire.

Essayez quelque chose comme ceci:

Dictionary<string,string> tableData = new Dictionary<string, string>(); 
var trNodes = eachNode.FindElements(By.TagName("tr")); 

foreach (var trNode in trNodes) 
{ 
    var name = trNode.FindElement(By.CssSelector(".name")).Text.Trim(); 
    var value = trNode.FindElement(By.CssSelector(".value")).Text.Trim(); 

    tableData.Add(name,value); 
} 

var location = tableData["location"]; 

vous devez ajouter la validation et vérifie le dictionnaire et la structure, mais qui est l'idée générale.