التجميع حسب القيمة التي تم تحليلها HTML AgilityPack C#
-
21-12-2019 - |
سؤال
تجميع البيانات في C#، لقد قمت بتحليل ملف html وحصلت على جميع البيانات الموجودة فيه، والآن أريد تجميعها على النحو التالي:
تلك الأسطر التي تم تحديدها هي الأصل وتحتوي على الأطفال التاليين، الكود الذي أعمل عليه موجود هنا:
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
.والنتيجة هي مثل هذا تقريبا: