پاك كردن Node هاي تكراري Xml با استفاده از Linq
فيد كاملي از وبلاگ هاي IT ايراني رو ميتونيد از اينجا دانلود كنيد
ولي مشكلي كه بشخصه با اين ليست دارم تكراري بودن بعضي فيدهاس (البته منطقا تكراري نيست) به شكل زير توجه كنيد
خوب براي حذف كردن اين Node هاي تكراي از فايل OPML از LINQ استفاده ميكنيم
براي اين كار از متد Distinct استفاده ميكنيم ولي نكته اي كه اينجا هست ما ميخواهيم برا اساس فيلدي كه ما مشخص ميكنيم عمل Distinct انجام بشه
براي اين كار بايد ما يك كلاس مجزا تعريف كنيم كه از EqualityComparer< T> Class به ارث بره
using System.Collections.Generic; namespace RemoveDuplicateNodes { public class Opml { public string Text { get; set; } public string Title { get; set; } public string Type { get; set; } public string XmlUrl { get; set; } public string HtmlUrl { get; set; } } public class OpmlCompare : EqualityComparer<opml> { public override bool Equals(Opml x, Opml y) { return x.HtmlUrl.Equals(y.HtmlUrl); } public override int GetHashCode(Opml obj) { return obj.HtmlUrl.GetHashCode(); } } }
حالا موقع فراخواني متد Distinct بجاي استفاده از مقايسه گر پيش فرض از كلاس مقايسه گري كه تعريف كرديم استفااده ميكنيم
using System; using System.Linq; using System.Xml.Linq; namespace RemoveDuplicateNodes { class Program { static void Main(string[] args) { var document = XDocument.Load(@"C:\Users\MohammadSaheb\Downloads\google-reader-subscriptions.xml"); var results = from node in document.Descendants("outline") where node.Attribute("htmlUrl") != null select new Opml { HtmlUrl = (string)node.Attribute("htmlUrl"), Text = (string)node.Attribute("text"), Title = (string)node.Attribute("title"), Type = (string)node.Attribute("type"), XmlUrl = (string)node.Attribute("xmlUrl") }; Console.WriteLine("Before : " + results.Count() + "\t" + "After : " + results.Distinct(new OpmlCompare()).Count()); Console.ReadLine(); } } }
خروجي به شكل زير ميشه
نظرات
ارسال یک نظر