Groupe par l'analyse de la valeur HTML AgilityPack C#
-
21-12-2019 - |
Question
Groupe de données en C#, j'ai analysé le fichier html et d'obtenir toutes les données sur elle, maintenant, je veux les regrouper comme suit:
Les lignes qui sont sélectionnés sont le parent et contenir les éléments suivants de l'enfant, le code sur lequel je travaille est ici:
var uricontent = File.ReadAllText("TestHtml/Bew.html");
var doc = new HtmlDocument(); // with HTML Agility pack
doc.LoadHtml(uricontent);
var rooms = doc.DocumentNode.SelectNodes("//table[@class='rates']").SelectMany(
detail =>
{
return doc.DocumentNode.SelectNodes("//td[@class='rate-description'] | //table[@class='rooms']//h2 | //table[@class='rooms']//td[@class='room-price room-price-total']").Select(
r => new
{
RoomType = r.InnerText.CleanInnerText(),
});
}).ToArray();
le RoomType contient les données qui sont analysées par le HTML AgilityPack, comment puis-je groupe par le Nom, comme le salaire et les Enregistrer , la Meilleure Chambre Disponible Seulement ...
Fichier HTML est ici : http://notepad.cc/share/g0zh0TcyaG
Merci
La solution
Au lieu de faire de l'union de 3 requêtes XPath, puis d'essayer de les regrouper en arrière par le Taux de "Description" (aka par élément : <td class="rate-description">
), vous pouvez le faire d'une autre manière autour.
Vous pouvez baser votre LINQ sélection par le Taux de "Description", puis dans la projection de la partie, obtenir tous les types de chambres et les tarifs des chambres en vertu de l'actuel Taux de "Description" aide par rapport XPath :
var rooms =
doc.DocumentNode
.SelectNodes("//table[@class='rates']//tr[@class='rate']")
.Select(r => new
{
RateType = r.SelectSingleNode("./td[@class='rate-description']")
.InnerText.CleanInnerText,
RoomTypes = r.SelectNodes("./following-sibling::tr[@class='rooms'][1]//table[@class='rooms']//h2")
.Select(s => new
{
RoomType = s.InnerText.CleanInnerText,
Rate = s.SelectSingleNode(".//parent::td/following-sibling::td[@class='room-price room-price-total'][1]")
.InnerText.CleanInnerText
}).ToArray()
}).ToArray();
Période de préavis au début de certaines requêtes XPath ci-dessus.Qui dit HtmlAgilityPack
que la requête est par rapport à l'actuel HtmlNode
.Le résultat est à peu près comme ceci :