Сгруппировать по проанализированному значению HTML AgilityPack C#

StackOverflow https://stackoverflow.com//questions/23028312

Вопрос

Сгруппируйте данные в C#, я проанализировал html-файл и получил все данные в нем, теперь я хочу сгруппировать их следующим образом:

enter image description here

Те строки, которые выбраны, являются родительскими и содержат следующие дочерние элементы, код, над которым я работаю, находится здесь:

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();

RoomType содержит данные, которые анализируются HTML AgilityPack, как я могу сгруппировать их по названию, например, Pay & Save , только лучшая доступная комната...

HTML-файл находится здесь : http://notepad.cc/share/g0zh0TcyaG

Спасибо

Это было полезно?

Решение

Вместо того, чтобы объединять 3 запроса XPath, а затем пытаться сгруппировать их обратно по "Описанию скорости" (то есть по элементу : <td class="rate-description">), вы можете сделать это по-другому.

Вы можете основывать свой выбор LINQ на "Описании тарифа", затем в части проекции получить все типы номеров и цены на номера в соответствии с текущим "Описанием тарифа", используя относительный 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();

Период уведомления в начале некоторых запросов XPath, приведенных выше.Это говорит HtmlAgilityPack что запрос относится к текущему HtmlNode.Результат примерно такой :

enter image description here

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top