Pregunta

Agrupe datos en C#, analicé el archivo html y obtuve todos los datos, ahora quiero agruparlos de la siguiente manera:

enter image description here

Esas líneas que están seleccionadas son las principales y contienen los siguientes hijos, el código en el que estoy trabajando está aquí:

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 contiene los datos que HTML AgilityPack analiza, ¿cómo puedo agruparlos por nombre como Pay & Save, Best Available Room Only...?

El archivo HTML está aquí: http://notepad.cc/share/g0zh0TcyaG

Gracias

¿Fue útil?

Solución

En lugar de realizar una unión de 3 consultas XPath, luego intentar agruparlas nuevamente por "Descripción de tarifa" (también conocido como por elemento: <td class="rate-description">), puedes hacerlo de otra manera.

Puede basar su selección de LINQ en la "Descripción de tarifas" y luego, en la parte de proyección, obtener todos los tipos de habitaciones y tarifas de habitaciones en la "Descripción de tarifas" actual utilizando 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 al comienzo de algunas consultas XPath anteriores.eso dice HtmlAgilityPack que la consulta es relativa a la actual HtmlNode.El resultado es más o menos así:

enter image description here

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top