سؤال

تجميع البيانات في 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