WPF開發較為完整的音樂播放器(二) ---Xml讀取類的構建


   在昨天的文章中,講述了開發音樂播放器的第一步之播放類的構建,今天的文章就開始第二步--Xml讀取類的構建。

   一個音樂播放器是要有列表文件的,這里就用Xml文件作為列表文件。

  為了讀取音樂列表更方便,我們將這方面的操作封裝成一個專門的類,名曰MusicListsReaders類。

   在構建類之前,先講一些關於Xml的基礎知識。

   一是XmlDocument類,它表示一個XML 文檔。可以用其中的Load方法加載一個Xml文件,在進行各種操作。可以參考msdn上的文章http://msdn.microsoft.com/zh-cn/library/system.xml.xmldocument.aspx

   二是XmlNode類,它表示 XML 文檔中的單個節點。其中的重要屬性是InnerText(表示節點中的文本)和ChildNodes屬性(表示節點下的所有子節點),重要方法則有SelectNodes(獲取指定的節點集合[獲取多個]和SelectSingleNode(獲取指定的節點[獲取第一個])。

   三是XmlElement類,它表示一個元素。除包含以上介紹的XmlNode具有的重要屬性和重要方法外,還有一個重要的方法GetAttribute,它返回返回具有指定名稱的特性的值。具體是什么意思呢,例如這里有一個Xml文件:

 

<Root>
   <Numbers>
         <Number id="1"></Number>
   </Numbers>
</Root>

 

這是一個最簡單的Xml文件,其中節點 Root 叫做根節點,它里面的節點叫做子節點,下層的是上層的子節點,其中的id="1",就是具有指定名稱的特征的值。

以上只介紹了我們在下邊會用到的方法及屬性,並不包含全部,具體請MSDN。

  新建一個類文件,在類的開頭聲明幾個私有變量:

        private string url;  //表示列表(Xml)文件路徑
        private XmlDocument dom;  //表示Xml文檔
        private bool isError=false;   //表示是否有錯誤
        private string errorText="";   //表示錯誤信息

 

現在開始編寫構造函數,和上一個類一樣,都是有兩個構造函數,方便用不同的方式傳入列表(xml)文件的路徑:

 

        /// <summary>
        /// 構造函數
        /// </summary>
        /// <param name="filename">音樂列表文件名</param>
        public MusicListsReader(string filename)
        {

            dom = new XmlDocument();
            LoadXml(filename);
        }
        /// <summary>
        /// 構造函數重載+1
        /// </summary>
        public MusicListsReader()
        {
            dom = new XmlDocument();
        }

 

以下是LoadXml的方法實現:

        /// <summary>
        /// 載入指定的音樂列表xml文件
        /// </summary>
        /// <param name="filename">音樂列表文件名</param>
        public void LoadXml(string filename)
        {
            if (url == "")
            {
                SetErrorInformation("親,列表讀取錯誤!");
            }
            url = filename;
            dom.Load(url);
        }

 

這是SetErrorInformation和GetErrorInformation方法的實現:

 

        /// <summary>
        /// 設置列表錯誤信息
        /// </summary>
        /// <param name="errortext"></param>
        /// <returns></returns>
        public void SetErrorInformation(string errortext)
        {
            isError = true;
            errorText =errortext;
        }

 

 

 

 

        /// <summary>
        /// 獲取列表錯誤信息
        /// </summary>
        /// <returns></returns>
        public string GetErrorInformation()
        {
            if (isError == true)
            {
                return errorText;
            }
            else
            {
                return null;
            }
        }

 

 

再展示下其余的代碼,相信大家完全可以看明白:

        /// <summary>
        /// 獲取文檔根節點
        /// </summary>
        /// <returns></returns>
        private XmlElement GetXmlRootElement()
        {
           return dom.DocumentElement;
        }
        /// <summary>
        /// 獲取列表的名稱
        /// </summary>
        public string GetXmlMusicListName()
        {
            XmlElement root=GetXmlRootElement();
            return GetAttribute(root, "name");
        }
        /// <summary>
        /// 獲取xml文件中所有的音樂子項
        /// </summary>
        /// <returns></returns>
        public XmlNodeList GetXmlMusicItems()
        {
          XmlElement root= GetXmlRootElement();//獲取根節點
          XmlNode rootn = XmlConverter(root);//轉換為XmlNode
          return rootn.SelectNodes("Music");//選定返回所有Music節點
        }
        /// <summary>
        /// 獲取列表中的音樂總數
        /// </summary>
        /// <returns></returns>
        public int GetXmlCount()
        {

            XmlElement xe= GetXmlRootElement();

            return xe.ChildNodes.Count;
        }
        /// <summary>
        /// 獲取指定元素的值
        /// </summary>
        /// <param name="xe"></param>
        /// <param name="attribute">XmlElement對象</param>
        /// <returns></returns>
        public string GetAttribute(XmlElement xe, string attribute)
        {
            return xe.GetAttribute(attribute);//返回該Attribute的值
        }
        /// <summary>
        /// 獲取指定歌曲的url
        /// </summary>
        /// <param name="xe">XmlElement對象</param>
        /// <returns></returns>
        public string GetMusicUrl(XmlElement xe)
        {
            return GetAttribute(xe, "url");
        }
        /// <summary>
        /// 獲取指定歌曲的歌手
        /// </summary>
        /// <param name="xe">XmlElement對象</param>
        /// <returns></returns>
        public string GetMusicSinger(XmlElement xe)
        {
            return GetAttribute(xe, "singer");
        }
        /// <summary>
        /// 獲取指定歌曲的名稱
        /// </summary>
        /// <param name="xe">XmlElement對象</param>
        /// <returns></returns>
        public string GetMusicName(XmlElement xe)
        {
            return xe.InnerText;
        }
        /// <summary>
        /// 獲取指定音樂節點
        /// </summary>
        /// <param name="index">序號</param>
        /// <returns>返回XmlNode對象</returns>
        private XmlNode  GetXmlMusicItemByIndex(int index)
        {
            XmlNodeList xnl = GetXmlMusicItems();
            return xnl.Item(index);
        }
        /// <summary>
        /// 獲取指定音樂節點的所有信息
        /// </summary>
        /// <param name="index">序號</param>
        /// <returns>返回XmlListProduct對象</returns>
        public XmlListProduct GetXmlMusicItemInformation(int index)
        {
            XmlNode xn=  GetXmlMusicItemByIndex(index);
            XmlElement xe = XmlConverter(xn);
            XmlListProduct xlp= new XmlListProduct(GetMusicUrl(xe),GetMusicName(xe), GetMusicSinger(xe));
            return xlp;
        }



        /// <summary>
        /// 將XmlElement轉換為XmlNode
        /// </summary>
        /// <param name="xe">要轉換的XmlElement</param>
        /// <returns></returns>
        private XmlNode XmlConverter(XmlElement xe)
        {
            return (XmlNode)xe;
        }
        /// <summary>
        /// 將XmlNode轉換為XmlElement
        /// </summary>
        /// <param name="xn">要轉換的XmlNode</param>
        /// <returns></returns>
        private XmlElement XmlConverter(XmlNode xn)
        {
            return (XmlElement)xn;
        }
        

    }

 

由於XmlNode和XmlElement經常需要轉換,就在上邊的代碼中寫了個重載函數,方便轉換。

以上只是對代碼的封裝,便於操作,涉及到的知識並是不很多。至此今天的文章到此結束。

在明天的文章中將會構建數據讀取類,為數據綁定做基礎的。

  希望大家拍磚別拍的太狠哈。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM