آموزش استفاده از XPath به همراه کلاس XmlDocument در زبان C#

از کلاس XnlDocument برای استخراج اطلاعات از فایل xml استفاده کردیم. ما این کار را با چندین بار فراخوانی خاصیت ChildNodes انجام دادیم که به علت ساده بودن فایل به کار رفته در مثال، کار ساده ای بود. روش فوق چندان خوانایی مناسبی برای کد ما ندارد، بنابراین در این درس به آموزش راه حلی دیگری خواهیم پرداخت.
تکنولوژی که در این درس از آن استفاده خواهیم کرد، XPath نام دارد که توسط همان کنسرسیومی که XML را گسترش داده، ایجاد گردیده است. XPath درواقع یک زبان کامل جستجو یا query language است با قابلیت های گسترده، اما از آنجا که این مجموعه، آموزش XPath نیست، ما فقط به بررسی برخی از query های پرکاربرد خواهیم پرداخت. اما به هر حال، حتی در ساده ترین مثال ها نیز ، XPath یک ابزاری قدرتمند است، همانطور که در مثال های این درس مشاهده خواهید کرد.
کلاس XMLDocument دارای چندین متد (methods) بوده که XPath query را به عنوان پارامتر ورودی دریافت کرده و نتایج حاصله را به صورت گروهی از XMLNode بر می گرداند. در این درس، به بررسی دو متد مختلف خواهیم پرداخت :

متد Select Single Node() که یک XmlNode تنها را بر حسب Xpath quert تعیین شده، جهت آن بر می گرداند.
تد SelectNodes() که مجموعه ای از XmlNode ها را بر حسب query Xpath تعیین شده برای آن، بر می گرداند (به صورت یک مجموعه ای از XmlNode objects).
ما هر دو متد معرفی شده را امتحان خواهیم کرد، اما بر خلاف درس های قبل که از یک فایل XML مرتبط با نرخ های ارز استفاده کردیم، از یک سورس جدید XML برای مثال هایمان بهره می گیریم. فردهای RSS feeds سندهای XML بسیار خوبی هستند که به شیوه خاص خود طراحی شده و به کاربران اجازه می دهند تا اخبار و اطلاعیه های مختلف را با روش مورد نظر خود جستجو کرده و بخوانند.
برای مثال های این درس از یک فید RSS Feed مربوط به سایت CNN از آدرس www.rss.cnn.com/rss/edition_world.rss استفاده خواهیم کرد که اخبار مختلفی از نقاط مختلف جهان را ارائه می دهد. اگر صفحه اشاره شده فوق را در مرورگر خود باز کنید، مرورگر شما اخبار را به شیوه ای جذاب برایتان نمایش داده و به سرعت می توانید تمامی Feed های جدید را با عناوین آن ها مرور کنید. اما گول این سیستم را نخورید! در پشت پرده، این صفحه یک فایل XML خاص است که اگر دکمه “View Source” را بر روی صفحه بزنید، کلیه محتویات آن را به صورت XML نشان می دهد. در کد پشت صفحه خواهید دید که محتویات XML یک المنت اصلی به نام “rss” دارند. هر المنت “rss” یک یا چندین المنت فرزند “channel” داشته که درون هر یک از آن ها می توانید اطلاعات لازم درباره هر feed را مشاهده کنید. همچنین عناصر “item” nodes مشروح اخبار که درواقع به دنبال آن ها هستیم را در بر می گیرند.
در مثال این درس، ما از متد SelectSingle.Node() برای دریافت عنوان یا title یک فید استفاده خواهیم کرد. اگر به سورس کد فایل XML نکاهی بیاندازید، خواهید فهمید که المنت title یک المنت فرزند برای المنت < channel > بوده که خود المنت عنصر اصلی یا root فایل یعنی < rss > است. Query مورد نیاز را به صورت زیر می توان در زبان Xpath نوشت :

//rss/channel/title 

در کد فوق، به سادگی نام یا name هر المنتی که به دنبال آن هستیم را نوشته و آن ها را با کاراکتر (/) از هم جدا کرده ایم. کاراکتر (/) تعیین می کند که هر المنت بعد از آن، فرزند یا child المنت قبل از آن می باشد. استفاده از زبان XPath به سادگی در کد مثال زیر نشان داده شده است :

using System;
using System.Text;
using System.Xml;
 
namespace ParsingXml
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("rss.cnn.com/rss/edition_world.rss");
            XmlNode titleNode = xmlDoc.SelectSingleNode("//rss/channel/title");
            if(titleNode != null)
                Console.WriteLine(titleNode.InnerText);
            Console.ReadKey();   
        }
    }
}

ما از متد SelectSingleNode() برای یافتن المنت title استفاده کردیم. که این متد Xpath query را به عنوان یک پارامتر string در ورودی دریافت می کند. سپس چک می کنیم آیا متد فوق نتیجه ای را بازگردانده یا خیر. که اگر بازگردانده باشد، محتوای Inner Text عنصر node مورد نظر را در خروجی چاپ می کند که همان عنوان یا title فید RSS می باشد.
در مثال بعدی، از متد Select Nodes() برای یافتن کلیه آیتم های node در فید RSS و سپس چاپ اطلاعات درباره آن ها در خروجی استفاده کرده ایم :

using System;
using System.Text;
using System.Xml;
 
namespace ParsingXml
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("rss.cnn.com/rss/edition_world.rss");
            XmlNodeList itemNodes = xmlDoc.SelectNodes("//rss/channel/item");
            foreach(XmlNode itemNode in itemNodes)
            {
                XmlNode titleNode = itemNode.SelectSingleNode("title");
                XmlNode dateNode = itemNode.SelectSingleNode("pubDate");
                if((titleNode != null) && (dateNode != null))
                    Console.WriteLine(dateNode.InnerText + ": " + titleNode.InnerText);
            }
            Console.ReadKey();   
        }
    }
}        

کد Select Nodes() همانند مثال قبلی، یک Xpath query را به عنوان پارامتر string ورودی دریافت کرده و سپس لیستی از اشیای XMLNode objects را به عنوان مجموعه ای از XMLNode List Collection بر می گرداند.
ما به وسیله یک حلقه foreach loop کد اجرای متد فوق را تکرار کرده و به ازای هر یک از آیتم های node، نام child node که همان title بوده و مقدار PubDate که اشاره به تاریخ نشر خبر دارد، را با استفاده از متد SelectSingleNode() به صورت مستقیم از عنصر استخراج می کنیم. اگر هر دو آیتم فوق را با موفقیت دریافت کنیم، هر دو تاریخ و عنوان (title) را بر روی خروجی در یک خط چاپ کرده و به سراغ عنصر بعدی می رویم.
در مثال فوق، ما از هرکدام از آیتم node ها دو مقدار (value) متفاوت را درخواست می کردیم. به خاطر همین بود که هر item node را به صورت تکی مورد بررسی قرار داده و آن را پردازش می کنیم. به هر حال، اگر ما فقط یکی از مقادیر فوق مثل title را بخواهیم، می توانیم Xpath query فوق را به صورت زیر نیز بنویسیم :

//rss/channel/item/title 

کد فوق نحوه انجام عملیات را به همراه چند دستور C# نشان می دهد :

//rss/channel/itXmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("rss.cnn.com/rss/edition_world.rss");
XmlNodeList titleNodes = xmlDoc.SelectNodes("//rss/channel/item/title");
foreach(XmlNode titleNode in titleNodes)
    Console.WriteLine(titleNode.InnerText);            
Console.ReadKey();em/title 

شاید این مطالب را هم دوست داشته باشید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.