Frage

Gruppieren Sie Daten in C#. Ich habe die HTML-Datei analysiert und alle Daten darauf erhalten. Jetzt möchte ich sie wie folgt gruppieren:

enter image description here

Die ausgewählten Zeilen sind die übergeordneten Zeilen und enthalten die folgenden untergeordneten Zeilen. Der Code, an dem ich arbeite, ist hier:

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

Der RoomType enthält die Daten, die von HTML AgilityPack analysiert werden. Wie kann ich sie nach Namen gruppieren, z. B. „Pay & Save“, „Nur bestes verfügbares Zimmer“ ...

Die HTML-Datei ist hier: http://notepad.cc/share/g0zh0TcyaG

Danke

War es hilfreich?

Lösung

Anstatt drei XPath-Abfragen zu vereinen und dann zu versuchen, sie nach „Ratenbeschreibung“ (auch bekannt als „nach Element“) zu gruppieren: <td class="rate-description">), Sie können es auch anders machen.

Sie können Ihre LINQ-Auswahl anhand der „Preisbeschreibung“ stützen und dann im Projektionsteil mithilfe des relativen XPath alle Zimmertypen und Zimmerpreise unter der aktuellen „Preisbeschreibung“ abrufen:

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

Kündigungsfrist zu Beginn einiger oben genannter XPath-Abfragen.Das sagt es HtmlAgilityPack dass die Abfrage relativ zum aktuellen ist HtmlNode.Das Ergebnis sieht ungefähr so ​​aus:

enter image description here

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top