Agrupar pelo valor analisado HTML AgilityPack C#
-
21-12-2019 - |
Pergunta
Agrupe os dados em C#, analisei o arquivo html e obtive todos os dados nele, agora quero agrupá-los da seguinte forma:
As linhas selecionadas são o pai e contêm os seguintes filhos. O código no qual estou trabalhando está aqui:
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();
o RoomType contém os dados que são analisados pelo HTML AgilityPack, como posso agrupá-los pelo nome, como Pay & Save, Best Available Room Only ...
O arquivo HTML está aqui: http://notepad.cc/share/g0zh0TcyaG
Obrigado
Solução
Em vez de unir 3 consultas XPath e tentar agrupá-las novamente por "Descrição da taxa" (também conhecido como por elemento: <td class="rate-description">
), você pode fazer isso de outra maneira.
Você pode basear sua seleção LINQ em "Descrição da tarifa" e, na parte de projeção, obter todos os tipos de quartos e tarifas na "Descrição da tarifa" atual usando XPath relativo:
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();
Período de aviso no início de algumas consultas XPath acima.Isso diz HtmlAgilityPack
que a consulta é relativa ao atual HtmlNode
.O resultado é mais ou menos assim: